tkinter <KeyRelease> Windows 和 Linux 上的不同行为
tkinter <KeyRelease> different behavior on Windows and Linux
在我的 CS class 中,我的学生刚刚完成了他们的第一个“克隆你的 classic”竞赛。 PONG
团队与他们的两名玩家在一个键盘版本上快速解决了“嘿,我的桨被冻结了”的问题。我在 5 年前遇到这个问题,发现 Python bind - allow multiple keys to be pressed simultaniously 启发了我(注意!文章使用 python2.7)。但我当时没有意识到该脚本只能在 windows 台机器上运行。
在 linux 系统上,<KeyRelease-a>
事件触发回调,但 event.char
然后指向“ ”,而不是预期的 'a'。我试着用谷歌搜索这个问题,但即使在 Whosebug
上我也找不到任何感兴趣的东西。
有什么提示吗?接下来找到可重现的代码示例:
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 提出的可重复性,我感谢他对我的问题的关注。
为了结束这个话题,所有的工作都由 Atlas435 完成:如果你想用 Tkinter 编写一个 Pong,用两个球拍独立地监听击键,按照这个 post Python bind - allow multiple keys to be pressed simultaniously 但在回调中将 e.char
更改为 e.keysym
以获取触发事件按下或释放的键。
在我的 CS class 中,我的学生刚刚完成了他们的第一个“克隆你的 classic”竞赛。 PONG
团队与他们的两名玩家在一个键盘版本上快速解决了“嘿,我的桨被冻结了”的问题。我在 5 年前遇到这个问题,发现 Python bind - allow multiple keys to be pressed simultaniously 启发了我(注意!文章使用 python2.7)。但我当时没有意识到该脚本只能在 windows 台机器上运行。
在 linux 系统上,<KeyRelease-a>
事件触发回调,但 event.char
然后指向“ ”,而不是预期的 'a'。我试着用谷歌搜索这个问题,但即使在 Whosebug
上我也找不到任何感兴趣的东西。
有什么提示吗?接下来找到可重现的代码示例:
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 提出的可重复性,我感谢他对我的问题的关注。
为了结束这个话题,所有的工作都由 Atlas435 完成:如果你想用 Tkinter 编写一个 Pong,用两个球拍独立地监听击键,按照这个 post Python bind - allow multiple keys to be pressed simultaniously 但在回调中将 e.char
更改为 e.keysym
以获取触发事件按下或释放的键。