以下代码显示了一个我不明白的问题:
from Tkinter import *
root = Tk()
cheese_var = IntVar()
parrot_var = IntVar(value=1)
check_menu = Menu(tearoff=0)
check_menu.add_checkbutton(label="Cheese", variable=cheese_var)
check_menu.add_checkbutton(label="Parrot", variable=parrot_var)
count = 0
class Top():
def __init__(self):
global count
count += 1
self.tl = Toplevel(root)
Label(self.tl, text="Window " + str(count)).pack()
self.mb = Menubutton(self.tl, text="Push Me", bg='pink')
self.menu = Menu(self.mb, tearoff=0)
self.menu.add_cascade(label="Choices", menu=check_menu)
self.menu.add_command(label="New Window", command=new_top)
self.mb.config(menu=self.menu)
self.mb.pack()
def new_top():
Top()
Top()
root.mainloop()
由创建的顶层窗口中的菜单按钮调出的菜单最初的行为与预期相同。单击此处的“新窗口”命令会创建一个新的此类窗口,该窗口的行为也符合预期。事实上,只要您继续创建新的顶级窗口,一切都会继续按预期工作。但是,一旦您删除(关闭)这些窗口中的任何一个,那么在随后创建的新窗口中,新菜单上的选项级联将不起作用。(在关闭之前创建的窗口中仍然可以。)
我最初遇到此症状的情况要复杂得多,但我能够将其简化为上面显示问题的示例。我发现我可以通过让每个 Top 实例创建自己的 check_menu 作为属性来避免这个问题;但我不明白为什么这应该是必要的。如果没有在多个窗口中使用的级联菜单的这种复制,请指出我的方法。