我有一个问题,我正在努力解决,并用下面的代码重现了它.

我的问题是,我可以从主菜单项中获得指定的命令来工作,但当相同的命令包含在级联菜单中时,它似乎不会执行.

我不确定这是否与我的需求有关,即我需要呈现一个按钮网格,并 for each 按钮附加一个上下文菜单.以下是我设计的一些代码,它们演示了这个问题:

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

当运行上面的代码时,它允许您右击任何呈现的按钮,并从主上下文菜单或层叠选项中 Select "打印 colored颜色 ".绑定到事件的命令只是获取按钮的 colored颜色 并将其打印到控制台.这适用于主上下文菜单选项,但级联菜单项不执行任何操作,尽管具有相同的命令.

对收到的任何建议表示感谢.

谢谢.

更新:在确定这似乎只发生在我的运行Python3.8的Linux Mint环境(它可以在我的Windows 10和Python3.10上运行)之后,我运行了Nordine在 comments 中建议的脚本:

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机器上升级到了Python3.10,但它仍然不能工作:O/

推荐答案

问题中代码中的子菜单被设置为button的元素:

sub_menu = tk.Menu(button, tearoff=False)

然而,这会导致子菜单正确显示,但不可点击(在Ubuntu、Python3.10.6、Tkinter 8.6上重现).当子菜单的元素为context_menu时,它确实起作用了:

sub_menu = tk.Menu(context_menu, tearoff=False)

Python相关问答推荐

在函数内部使用eval(),将函数的输入作为字符串的一部分

如何从具有多个嵌入选项卡的网页中Web抓取td类元素

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

线性模型PanelOLS和statmodels OLS之间的区别

max_of_three使用First_select、second_select、

重新匹配{ }中包含的文本,其中文本可能包含{{var}

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

在Python中动态计算范围

在极性中创建条件累积和

名为__main__. py的Python模块在导入时不运行'

Django admin Csrf令牌未设置

使用特定值作为引用替换数据框行上的值

在Python中使用if else或使用regex将二进制数据如111转换为001""

如何将数据帧中的timedelta转换为datetime

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

如何获得3D点的平移和旋转,给定的点已经旋转?

如何为需要初始化的具体类实现依赖反转和接口分离?

使用xlsxWriter在EXCEL中为数据帧的各行上色

在Django REST框架中定义的URL获得404分