我有一个问题,我正在努力解决,并用下面的代码重现了它.
我的问题是,我可以从主菜单项中获得指定的命令来工作,但当相同的命令包含在级联菜单中时,它似乎不会执行.
我不确定这是否与我的需求有关,即我需要呈现一个按钮网格,并 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/