将按钮绑定到Alt按键?

Dem*_*nex 5 tkinter

我已经编写了一个简单的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应用程序.

谢谢.

Dem*_*nex 1

答案是修改 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)

这是一个多么混乱的问题,通过间接改变来改变未记录的隐含行为......