Grid_forget()未删除小部件

时间:2017-06-23 13:28:20

标签: python python-2.7 tkinter

Minimal App from the Tkinter Docs之后,我添加了一个按下按钮时调用的功能。该函数只在窗口中显示一个Label。当我第二次按下按钮时,我希望它删除旧标签并显示一个新标签。相反,grid_forget()不会删除Label,而只是在新行上重复标签。

为什么Label窗口小部件没有从窗口中删除?下面的代码说明了这个问题。我在这里阅读了无数关于从显示中删除小部件和使用grid_forget()的问题。

我唯一能想到的是窗口小部件可能是displayText()的局部变量,每次按下按钮调用它时,都没有display变量,并且引发了异常。我尝试将display作为一个全局变量,但它没有用。

import Tkinter as tk

def displayText():
    try:
        display.grid_forget()
        display.destroy()
    except UnboundLocalError:
        #Display will not exist on first button press
        pass

    label = 'Hello World'
    display = tk.Label(text=label)
    #Also tried called display.grid_forget() here
    display.grid()
    display.bell()

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)
        self.grid(sticky=tk.N+tk.E+tk.W)
        self.createWidgets()
    def createWidgets(self):
        top=self.winfo_toplevel()
        top.geometry('300x100+50+50')
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.check = tk.Button(self, text='Say Hi', command=lambda : displayText())
        self.check.grid(row=0, column=0, sticky=tk.N+tk.E+tk.W)

app = Application()
app.master.title('Test App')
app.mainloop()

1 个答案:

答案 0 :(得分:1)

您可以将小部件display分配给def __init__()中的主类,并将该功能作为方法移动。目标是在应用程序运行期间对窗口小部件进行控制。

import Tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self,master)
        self.grid(sticky=tk.N+tk.E+tk.W)
        self.createWidgets()
        self.display = None

    def createWidgets(self):
        top=self.winfo_toplevel()
        top.geometry('300x100+50+50')
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        self.columnconfigure(0, weight=1)
        self.check = tk.Button(self, text='Say Hi', command=self.displayText) 
        self.check.grid(row=0, column=0, sticky=tk.N+tk.E+tk.W)

    def displayText(self):
        if self.display:
            self.display.configure(text='hello new world')

        else:
            label = 'Hello World'
            self.display = tk.Label(text=label)
            #Also tried called display.grid_forget() here
            self.display.grid()
            self.display.bell()

app = Application()
app.master.title('Test App')
app.mainloop()
相关问题