【问题标题】:Key Bindings 1-5 not working Tkinter键绑定 1-5 不起作用 Tkinter
【发布时间】:2018-07-20 16:01:45
【问题描述】:

我在一个小项目中使用 Python 的 Tkinter,我需要使用数字键盘进行键绑定。但是,按键 1、2、3、4 和 5 没有响应。所有其他键都可以正常工作。 例如:

from tkinter import *
window = Tk()
window.title('Key Test')
c = Canvas(window, height=500, width=500)
c.pack()
word = c.create_text(250, 250, text='Spam')
def transformation(event):
    c.itemconfig(word, text='Spamalot')
c.bind_all('<6>', transformation)

上面的代码工作得很好。但是将“5”而不是“6”放在绑定中会使程序无响应。我曾尝试在其他窗口中执行此操作,甚至尝试使用不同的键盘。
似乎没有任何效果。谁能解释一下这个问题?

【问题讨论】:

  • &lt;1&gt; 被视为&lt;Button-1&gt; 的缩写版本,而不是&lt;Key-1&gt;。支持 5 个鼠标按钮,因此您看到的问题是有限的。
  • @jasonharper 1 到 3 测试成功,但 4 和 5 无法正常工作。你会碰巧知道 4 和 5 映射到什么吗?我以为是向上滚动和向下滚动。

标签: python tkinter key-bindings


【解决方案1】:

我不知道为什么&lt;6&gt; 有效,但关键事件的正式名称为&lt;Key-…&gt;,请参阅keysyms manual page

c.bind_all('<Key-5>', transformation)

编辑基于Jason HarperMike - SMT的建议,我查看了Tk源代码(在generic/tkBind.c中),确实是这样:

    if ((*field >= '1') && (*field <= '5') && (field[1] == '\0')) {
        if (eventFlags == 0) {
            patPtr->eventType = ButtonPress;
            eventMask = ButtonPressMask;
        } else if (eventFlags & KEY) {
            goto getKeysym;
        } else if (!(eventFlags & BUTTON)) {
…
        }
        patPtr->detail.button = (*field - '0');
    } else {

    getKeysym:
        patPtr->detail.keySym = TkStringToKeysym(field);

所以&lt;1&gt;&lt;5&gt; 确实是特殊情况下的指针设备/鼠标按钮。偷偷摸摸。

【讨论】:

  • 感谢您将其添加进来。我不能 100% 确定这是不是发生了什么。很高兴知道代码在哪里验证我的猜测。
  • 经过一番挖掘,我找到了解释 1,2 和 3 如何工作以及 4 和 5 在 linux 下如何工作的参考资料。 Tkinter 8.5 reference: a GUI for PythonIf the event was related to a mouse button, this attribute is set to the button number (1, 2, or 3). For mouse wheel support under Linux, bind Button-4 and Button-5 events; when the mouse wheel is scrolled up, this field will be 4, or 5 when scrolled down. 所以 4 和 5 可能不适用于 windows 用户。
  • @Edmond301 请确保选中解决您问题的答案旁边的复选标记。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多