在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()
答案 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()