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
相关产品推荐
相关产品推荐

