无法在Tkinter的Toplevel容器中包含小部件

时间:2015-07-08 22:30:58

标签: python tkinter

我使用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()

直到我尝试在第二个窗口中安装标签,代码才有效。如何让两个窗口保持正常运行?

1 个答案:

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

我还清理了您的变量名称,以便它们看起来不像是类名(例如MyClassmy_label)。