如何从窗口中删除Tkinter窗口小部件?

问题描述:

我有一个Tkinter小部件的列表,我想动态更改。如何从窗口中删除Tkinter窗口小部件?

我怎样才能从我的窗口彻底删除窗口小部件?

您可以拨打pack_forget删除小部件(如果您使用pack将其添加到窗口中)。

例子:

from tkinter import * 

root = Tk() 

b = Button(root, text="Delete me", command=lambda: b.pack_forget()) 
b.pack() 

root.mainloop() 

如果使用pack_forget,您可以稍后显示的窗口小部件再次再次调用pack。如果您想永久删除它,请在小部件上拨打destroy(然后您将无法重新添加它)。

如果使用grid方法,你可以使用grid_forgetgrid_remove隐藏小部件。

+6

@TheBeardedBerry:注意'pack_forget'不会删除窗口小部件,只是将其从视图中删除。它们仍然存在,如果你继续重新创建而不销毁它们,可能会导致内存泄漏。 –

+3

如果'pack_forget'框架,然后删除它,它是否也会删除子窗口小部件,或者我应该单独删除它们? – Marco83

+0

你可以做一些类似'place_forget'的地方而不是包吗? – Stegosaurus

我发现当widget是功能的一部分,而grid_remove是另一个功能的一部分时,它不会删除标签。在这个例子中...

def somefunction(self): 
    Label(self, text=" ").grid(row = 0, column = 0) 
    self.text_ent = Entry(self) 
    self.text_ent.grid(row = 1, column = 0) 
def someotherfunction(self): 
    somefunction.text_ent.grid_remove() 

...有没有有效的方法来删除标签。

我能找到的唯一的解决办法是给标签的名称,并使其成为全球:

def somefunction(self): 
    global label 
    label = Label(self, text=" ") 
    label.grid(row = 0, column = 0) 
    self.text_ent = Entry(self) 
    self.text_ent.grid(row = 1, column = 0) 
def someotherfunction(self): 
    global label 
    somefunction.text_ent.grid_remove() 
    label.grid_remove() 

当我遇到了这个问题,有一个类参与,一个功能类和一个不是,所以我不确定global label线路是否真的需要在上面。

+1

事实上,无法删除您创建的第一个标签与您在一个函数中创建并将其移除的事实无关,只是您失败坚持参考。这不是一个tkinter的东西,它是一个编程的东西 - 对一个对象采取行动,你必须有一个对象的引用。在你的第二个例子中,你不需要使用全局变量。相反,将它分配给'self'就像你做入口小部件一样。 –

你可以做到这一点的一种方法是从需要清除的框架中​​获取从属列表,根据需要销毁或“隐藏”它们。为了得到一个清晰的框架,你可以做这样的:

from tkinter import * 

root = Tk() 

def clear(): 
    list = root.grid_slaves() 
    for l in list: 
     l.destroy() 

Label(root,text='Hello World!').grid(row=0) 
Button(root,text='Clear',command=clear).grid(row=1) 

root.mainloop() 

grid_slaves()pack_slaves()slaves()取决于你所使用的小部件添加到框架的方法,你应该调用。

今天我在python3中学习了一些使用tkinter gui库的简单和好的点击事件处理,我想在这个线程中分享这个。

from tkinter import * 

cnt = 0 


def MsgClick(event): 
    children = root.winfo_children() 
    for child in children: 
     # print("type of widget is : " + str(type(child))) 
     if str(type(child)) == "<class 'tkinter.Message'>": 
      # print("Here Message widget will destroy") 
      child.destroy() 
      return 

def MsgMotion(event): 
    print("Mouse position: (%s %s)" % (event.x, event.y)) 
    return 


def ButtonClick(event): 
    global cnt, msg 
    cnt += 1 
    msg = Message(root, text="you just clicked the button..." + str(cnt) + "...time...") 
    msg.config(bg='lightgreen', font=('times', 24, 'italic')) 
    msg.bind("<Button-1>", MsgClick) 
    msg.bind("<Motion>", MsgMotion) 
    msg.pack() 
    #print(type(msg)) tkinter.Message 


def ButtonDoubleClick(event): 
    import sys; sys.exit() 


root = Tk() 

root.title("My First GUI App in Python") 
root.minsize(width=300, height=300) 
root.maxsize(width=400, height=350) 
button = Button(
    root, text="Click Me!", width=40, height=3 
) 
button.pack() 
button.bind("<Button-1>", ButtonClick) 
button.bind("<Double-1>", ButtonDoubleClick) 

root.mainloop() 

希望这将帮助别人......

+0

这应该是这个问题的答案吗?如果没有,请删除它。如果是这样,你需要澄清这与删除小部件有何关系。 –

+0

感谢@BryanOakley激励我为python3。 :d – ArifMustafa