我想创建两个窗口。
Windows的行为:
Window1有一个label
和一个button
。当我点击button
时,必须打开第二个窗口。第二个窗口有一个label
。
问题:
第二个窗口中的 Label
没有出现。
代码:
def window1():
root = tkinter.Tk()
root.geometry("200x200")
root.title("Window1")
var = tkinter.StringVar()
tkinter.Label(root, textvariable = var, bg = "red").grid(row = 0, column = 0)
var.set("This is window1")
tkinter.Button(root, text = "Button1", command = OnBut).grid(row = 0, column = 1)
root.mainloop()
def OnBut():
window2()
def window2():
root = tkinter.Tk()
root.title("Window2")
root.geometry("250x250")
var = tkinter.StringVar()
tkinter.Label(root, textvariable = var, bg = "blue").grid(row = 1, column = 0, padx = 3, pady = 3)
tkinter.Button(root, text = "Button", command = OnBut).grid(row = 0, column = 1, padx =3, pady = 3)
var.set("This is window2") #not appearing <-- problem
root.mainloop()
window1()
当我单独打电话给window2
时,它的工作正常。为什么label
无法在第二个窗口中打印,只需点击button
?
答案 0 :(得分:1)
在这种情况下,您并不需要为command
提供真正的功能。这就是lambda
的用途 - 回调!
删除onBut
功能(无论如何都是问题,因为root
未在此处定义)并将每个按钮中的command
替换为:
command = lambda: window2(root)
目前,当您致电onBut
时,它会尝试执行以下操作:
window2(root)
# HELP I DON'T KNOW WHAT root IS!!
这会在我的副本上抛出NameError
。您的代码可能会有所不同。
由于您不耐烦地编辑,让我给您写一些工作代码。
import tkinter
def run():
root = tkinter.Tk()
root.title("Window1")
s_var = tkinter.StringVar()
tkinter.Label(root, textvariable = s_var).pack()
tkinter.Button(root, text = "Button", command = lambda: makewindow(root)).pack()
s_var.set("Window #1")
def makewindow(root):
top = tkinter.Toplevel(root)
top.title("Window2")
s_var = tkinter.StringVar()
tkinter.Label(top, textvariable = s_var).pack()
tkinter.Button(top, text = "Button", command = lambda: makewindow(root)).pack()
s_var.set("Window #2")
if __name__ == "__main__":
run()