如何在不打开菜单的情况下通过Tkinter快捷键选中菜单中的单选按钮?
如何在不打开菜单的情况下通过Tkinter快捷键选中菜单中的单选按钮?
嘿,我懂你的困扰!你给菜单里的单选按钮加了加速器,但只有菜单展开时快捷键才生效,想让快捷键在任何状态下都能直接触发选项选中并执行对应的逻辑对吧?
问题出在你之前的bind_all只是单纯设置了self.nitem的值,这并不会触发单选按钮绑定的info方法,而且Tkinter菜单的加速器默认就是只在菜单激活时才响应。要解决这个问题,我们可以直接调用菜单条目的invoke()方法,它能模拟用户点击该选项的操作——既会选中对应的单选按钮,也会自动执行绑定的命令,完全和手动点击菜单选项效果一样,还不用打开菜单。
下面是修改后的完整代码,我调整了快捷键的绑定逻辑:
import tkinter as tk class GrilleFenetre(tk.Tk): """ interface graphique pour resoudre les hanjies """ def __init__(self): super().__init__() self.nitem = tk.IntVar() self.menu_bar = tk.Menu(self) self.config(menu=self.menu_bar) self.menu_algo = tk.Menu(self.menu_bar, tearoff=0) self.menu_bar.add_cascade(label="Algorithme", menu=self.menu_algo, underline=0) # 添加菜单单选按钮 self.menu_algo.add_radiobutton(label="Algorithme 1", variable=self.nitem, value=1, command=self.info, accelerator="Option-1") self.menu_algo.add_radiobutton(label="Algorithme 2", variable=self.nitem, value=2, command=self.info, accelerator="Option-2") self.menu_algo.add_radiobutton(label="Algorithme 3", variable=self.nitem, value=3, command=self.info, accelerator="Option-3") self.menu_algo.add_separator() self.menu_algo.add_radiobutton(label="Algorithme hanjie 1", variable=self.nitem, value=4, command=self.info, accelerator="Option-4") self.menu_algo.add_radiobutton(label="Algorithme hanjie 2", variable=self.nitem, value=5, command=self.info, accelerator="Option-5") # 绑定快捷键:直接调用对应菜单条目的invoke方法 self.bind_all("<Option-1>", lambda x: self.menu_algo.invoke(0)) self.bind_all("<Option-2>", lambda x: self.menu_algo.invoke(1)) self.bind_all("<Option-3>", lambda x: self.menu_algo.invoke(2)) self.bind_all("<Option-4>", lambda x: self.menu_algo.invoke(4)) # 注意分隔符占了索引3的位置 self.bind_all("<Option-5>", lambda x: self.menu_algo.invoke(5)) def info(self): n = self.nitem.get() print("algo", n) if __name__ == "__main__": fenetre = GrilleFenetre() fenetre.geometry("900x650+350+150") # Taille initiale de la fenêtre fenetre.mainloop()
这里需要注意一个小细节:菜单里的分隔符也会占用一个索引位置,所以第四个功能选项(Algorithme hanjie 1)的索引是4,前面三个单选按钮加一个分隔符,索引从0开始数依次是0、1、2、3(分隔符)、4、5。
这样修改后,不管菜单有没有打开,按下Option-1到Option-5都会直接触发对应的操作:选中目标单选按钮、更新self.nitem的值,同时执行info方法打印对应的算法编号。
如果你担心后续调整菜单顺序会导致索引失效,也可以给每个菜单项设置唯一的标签,再通过self.menu_algo.index("标签名")来动态获取索引,但对于当前的场景,固定索引已经足够简单好用啦。
备注:内容来源于stack exchange,提问作者joMonk
相关产品推荐
相关产品推荐

