我使用Tkinter
打开一个窗口的代码,然后(点击一个按钮后)打开一个Toplevel
容器。我正在尝试将Label
小部件放入此附加窗口,但不断收到错误消息“无法调用label命令:应用程序已被破坏。”
如何保持root.Tk()
窗口打开以避免此错误?
以下是我的代码:
import Tkinter
from Tkinter import *
root = Tk()
root.wm_title("First Window")
NewWin = Button(root, text="Click Me!", command=newwin)
NewWin.pack()
def newwin():
top = Toplevel()
top.wm_title("Second Window")
Praise = Label(top, text="Good Work!")
Praise.grid()
root.mainloop()
直到我尝试在第二个窗口中安装标签,代码才有效。如何让两个窗口保持正常运行?
答案 0 :(得分:1)
问题是局部变量对于更广泛的范围是不可见的。因此,就程序的其余部分而言,top
引用不存在。最简单的选择是将所有窗口的逻辑放入创建它的函数中。
from Tkinter import *
root = Tk()
root.wm_title("First Window")
def new_win():
top = Toplevel()
top.wm_title("Second Window")
praise = Label(top, text="Good Work!")
praise.grid()
new_win_button = Button(root, text="Click Me!", command=new_win)
new_win_button.pack()
root.mainloop()
您还可以转到OO方法,只需保存对应用程序中所有相关对象的引用:
from Tkinter import *
class App(object):
def __init__(self, parent):
self.parent = parent
parent.wm_title("First Window")
self.new_win_button = Button(root, text="Click Me!", command=self.new_win)
self.new_win_button.pack()
self.populate_button = Button(root, text="Populate", command=self.populate)
self.populate_button.pack()
def new_win(self):
self.top = Toplevel()
self.top.wm_title("Second Window")
def populate(self):
self.praise = Label(self.top, text="Good Work!")
self.praise.grid()
root = Tk()
app = App(root)
root.mainloop()
我还清理了您的变量名称,以便它们看起来不像是类名(例如MyClass
与my_label
)。