我已经编写了一个简单的Tkinter应用程序,在表单底部有几个按钮.我的目标是遵循按钮上的字母加下划线的标准约定,并使用Alt键绑定该字母的操作(即:Alt-s表示"_S_ave").
我已经尝试将根窗口绑定到"Alt-s","Alt-KeyPress-s"和"Mod1-s",似乎没有一个可靠地工作.它们有时会触发,但即使我在事件函数上有"返回中断","s"字母也会传播到条目小部件.
我认为这是Linux/X11和Mod1与Alt处理的问题,因为Control键绑定一致地工作.我无法找到解决问题的最佳做法,因此我在此提出上诉.
有人可以分享如何在Linux/X11中使用Alt键绑定吗?
**更新了样本
from Tkinter import *
class GUI:
def __init__(self,root):
self.root = root
e = Entry(self.root)
e.grid(column=0,row=0)
b = Button(self.root, text="Save", underline = 0)
b.grid(column=0,row=1)
root.bind("<Alt-s>",self.save)
e.focus()
def save(self,event=None):
print("Hey, you pressed Alt-s!")
return "break"
root = Tk()
App = GUI(root)
print("At this point, pressing Alt-s places the s string in the entry widget, and doesn't trigger")
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
**更新2
我有一些评论家让我知道这对他们的系统有效,甚至是Linux.我的平铺wm或X11的其他配置可能有问题,但是我使用Alt与任何其他X11 GUI应用程序没有任何问题.
我愿意接受有关如何排除故障的建议.
**更新3
我一直在检查xmodmap的行为,看来当我分配Alt_R时,Tk键绑定停止工作.xev报告的事件逐字匹配,但Tk的行为发生了变化.仍在挖掘.
**更新4
Lange先生在Tkinter列表中找到了一个有助于解释类似行为的链接,请访问https://bbs.archlinux.org/viewtopic.php?id=58145.
我已经对我的xmodmap进行了更改,现在Alt按预期工作.我无法解释为什么将Alt_R绑定到mod4会影响Alt_L,或者为什么它只影响Tk应用程序.
谢谢.
答案是修改 Alt_R 将其绑定到 Windows 键(Mod4)是问题的根本原因。我相信这使得 Alt_L 作为 Mod1 工作,尽管它在 xmodmap 中没有明确修改。因此,它肯定破坏了一些隐含行为,但仅限于 Tk 应用程序。
从 Arch BBS 链接修改 Alt_R 键码以触发 Super_L 解决了该行为。所以现在 Alt_R 充当 Windows 键,但 Tk 没有注意到 Alt_L 的任何变化。
现在,Alt 的根绑定无需双重绑定即可正常工作,因为默认情况下 Entry 小部件会忽略 Alt 按键。通过正确的 Alt 行为,不仅 Alt 键绑定可以工作,而且也不需要回车符行为。
我没有在任何小部件中看到 Mod1 键的默认忽略绑定,并且如果 Alt_L 突然决定呈现 Mod1,这确实解释了 Mod1 绑定将触发的行为,但需要双重绑定来防止 Entry 小部件获取密钥。
~/.Xmodmap 供参考:
! ISO_Level3_Shift is what xev reports for my right Alt key
! mod4 is the Windows key modifier, and tied to WM operations
! Trying a different approach documented at
! https://bbs.archlinux.org/viewtopic.php?id=58145
keycode 108 = Super_L
remove mod1 = Super_L
Run Code Online (Sandbox Code Playgroud)
这是一个多么混乱的问题,通过间接改变来改变未记录的隐含行为......
| 归档时间: |
|
| 查看次数: |
3847 次 |
| 最近记录: |