是什么导致了python中tkinter的级联菜单失败?

2024-04-29 20:26:35 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码显示了一个我不理解的问题:

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

在创建的顶层窗口中,由menu按钮打开的菜单最初的行为与预期一致。单击newwindow命令将创建一个新的这样的窗口,它的行为也与预期的一样。事实上,只要您不断地创建新的顶层窗口,一切都将继续按预期工作。但是,一旦删除(关闭)这些窗口中的任何一个,那么,在随后创建的新窗口中,新菜单上的级联选项将不起作用。(在关闭一个窗口之前创建的窗口中仍然可以。)

我最初遇到这种症状的情况要复杂得多,但我能够将其简化为上面的示例,该示例展示了这个问题。我发现通过让Top的每个实例创建自己的check_菜单作为属性,可以避免这个问题;但是我不明白为什么需要这样做。如果没有在多个窗口中使用层叠菜单的复制,请给我指路。在


Tags: selfaddvartopcheckcount菜单mb
1条回答
网友
1楼 · 发布于 2024-04-29 20:26:35

不幸的是,我认为做你想做的事是不可能的。我会尽力解释的。在

当您第一次运行脚本时,check_菜单将被创建并在第一个窗口中正常工作。当您创建更多窗口时,check_菜单只是在它们之间共享。但是,当您关闭其中一个时,check_菜单(及其下的所有内容)将被销毁。所以,当你在之后创建一个新窗口时,check_菜单不再存在,也不再显示。在

但是,脚本不会抛出错误,因为出于某种原因,Tkinter允许您将菜单分配给不是菜单的内容。信不信由你,以下代码都没有:

self.menu.add_cascade(label="Choices", menu=None)
self.menu.add_cascade(label="Choices", menu=1)
self.menu.add_cascade(label="Choices", menu="")

会破坏剧本。只是“每一个选择都是空的”。在

基本上就是这样。关闭一个窗口后,检查菜单,它下面的所有内容都会被销毁。然而,Tkinter并没有抛出错误,而是将一个菜单分配给不再是菜单的内容(就其分配菜单的内容而言,我相信它使用的是check_menu的旧实例,该实例已被销毁)。在

要解决此问题,请在每次调用Top时重新创建check_菜单及其下的所有内容。换句话说,将check_菜单的代码(及其选项)放在Top的__init__方法中。这样,每次调用Top时,check_菜单就会存在。在

希望这能有所帮助(而且我对此做了充分的解释:)

相关问题 更多 >