You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter级联菜单命令无法执行问题求助

问题分析与解决

问题原因

代码中创建级联子菜单时,错误地将按钮(button)作为子菜单的父组件,而非上级的上下文菜单(context_menu)。Tkinter在Linux Mint的Tk环境下对菜单父子层级的校验更严格,这种错误的关联会导致子菜单命令无法正常触发;而Windows平台的Tk实现兼容性更强,因此未出现该问题。

修复方案

将子菜单sub_menu的父组件从button改为context_menu:

修改前:

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

修改后:

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

完整修复代码

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)
            # 主菜单添加打印选项
            context_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
            sub_menu = tk.Menu(context_menu, tearoff=False)
            # 级联菜单添加打印选项
            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()

验证说明

修改后在Linux Mint环境下右键点击按钮,级联菜单中的「Print colour」选项会正常触发打印按钮背景色的操作,与主菜单行为一致。

内容的提问来源于stack exchange,提问作者avalon20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:37:26