【问题标题】:tkinter <KeyRelease> different behavior on Windows and Linuxtkinter <KeyRelease> 在 Windows 和 Linux 上的不同行为
【发布时间】:2021-03-11 17:44:58
【问题描述】:

在我的 CS 课上,我的学生刚刚完成了他们的第一次“克隆你的经典”竞赛。 PONG 团队在一个键盘版本上与他们的两名玩家一起快速解决了“嘿,我的桨被冻结了”的问题。我在 5 年前遇到了这个问题,发现 Python bind - allow multiple keys to be pressed simultaniously 启发了我(注意!本文使用 python2.7)。但我当时并没有意识到这个脚本只能在 windows 机器上运行。

在 linux 系统上,&lt;KeyRelease-a&gt; 事件会触发回调,但 event.char 然后指向 ' ' 而不是 'a',正如人们所期望的那样。我尝试用谷歌搜索这个问题,但即使在 stackoverflow 上我也找不到任何感兴趣的东西。

有什么提示吗?接下来找到可重现的代码示例:

import os
from tkinter import *

os.system("xset r off")

def keyup(e):
    #print(f"up {e.char}")
    print(f"up {e.keysym}")

def keydown(e):
    #print(f"down {e.char}")
    print(f"down {e.keysym}")

root = Tk()
frame = Frame(root, width=100, height=100)
frame.bind("<KeyPress>", keydown)
frame.bind("<KeyRelease>", keyup)
frame.pack()
frame.focus_set()
root.mainloop()

os.system("xset r on")

感谢 Bryan 提出的可重复性问题,感谢他对我的问题的关注。

【问题讨论】:

  • edit您的问题包括minimal reproducible example。它不应该只需要十几行左右。
  • import os from tkinter import * os.system("xset r off") def keyup(e): print(f"up {e.char}") def keydown(e): print(f"down {e.char}") root = Tk() frame = Frame(root, width=100, height=100) frame.bind("&lt;KeyPress&gt;", keydown) frame.bind("&lt;KeyRelease&gt;", keyup) frame.pack() frame.focus_set() root.mainloop() os.system("xset r on")
  • 请不要在评论区贴代码。如果您想添加更多信息,请edit 提问。
  • 你试过e.keysym 吗?他们在offical tcl documentation 中使用keysym
  • @Atlas435 非常感谢,e.keysym 做得很好。

标签: python tkinter cross-platform keyrelease


【解决方案1】:

结束话题,所有的工作都由 Atlas435 完成:如果你想用 Tkinter 编写 Pong 代码,两个拨片独立监听击键,请关注此帖子 Python bind - allow multiple keys to be pressed simultaniously,但将 e.char 更改为 @ 987654323@ 在回调中获取哪个键触发了按下或释放事件。

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多