Python Tkinter 级联菜单命令未执行

问题描述 投票:0回答:0

我有一个问题,我正在尝试解决,并用下面的代码重现了它。

我遇到的问题是,我可以从主菜单项中获取指定的命令,但是当级联菜单中包含相同的命令时,它似乎没有执行。

我不确定这是否与我的要求有关,我需要呈现一个按钮网格并为每个按钮附加一个上下文菜单。这是我设计的一些代码来证明这个问题:

import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Tkinter Validation Demo')

        self.create_widgets()

    @staticmethod
    def print_bg_color(button, button_id):
        colour = button.cget('bg')
        print(f'Button {button_id} colour is {colour}')

    @staticmethod
    def _context_menu(event: tk.Event = None, menu: tk.Menu = None):
        menu.tk_popup(event.x_root, event.y_root)

    def create_widgets(self):
        colors = ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
        for i in range(0, 7):
            button = tk.Button(master=self, bg=colors[i], width=10, height=10)
            button.grid(row=0, column=i)
            context_menu = tk.Menu(button, tearoff=False)
            # Add print option to main menu
            context_menu.add_command(label="Print colour",
                                     command=lambda btn=button, button_id=i:
                                     self.print_bg_color(button=btn, button_id=button_id))

            sub_menu = tk.Menu(button, tearoff=False)
            # Add a print colour option on the sub menu
            sub_menu.add_command(label="Print colour",
                                 command=lambda btn=button, button_id=i:
                                 self.print_bg_color(button=btn, button_id=button_id))
            context_menu.add_cascade(label='Cascade', menu=sub_menu)

            button.bind("<Button-3>",
                        lambda event, menu=context_menu, button_id=i:
                        self._context_menu(event, menu))


if __name__ == '__main__':
    app = App()
    app.mainloop()

运行上述代码时,它允许您右键单击任何呈现的按钮,然后从主上下文菜单或级联选项中选择“打印颜色”。绑定到事件的命令,简单地获取按钮的颜色并将其打印到控制台。这适用于主上下文菜单选项,但级联菜单条目什么也不做,尽管有相同的命令。

收到任何建议。

谢谢。

更新:确定这似乎只发生在我运行 Python 3.8 的 Linux Mint 环境中(它在我的 Windows 10 和 Python 3.10 上运行),我运行了 Nordine 在评论中建议的脚本:

import tkinter
from platform import python_version
print(python_version())
root = tkinter.Tk()
print(root.tk.call("info", "patchlevel"))

结果显示为:

3.8.10
8.6.10

进一步更新:

我刚刚在我的 Linux Mint 机器上升级到 Python 3.10,但它仍然无法运行 :o/

python tkinter menu command cascade
© www.soinside.com 2019 - 2024. All rights reserved.