我正在尝试用Python制作一个简单的Tkinter程序,打印" True"当我按下" U"键和"错误"当我放手。不幸的是,当我运行该程序时,它会打印" True"当我按下" U"然后300毫秒后打印" False"。
我希望将其保留在Tkinter或其他内置模块中,我不想使用像Pygame这样的外部模块。我在Mac上,OS X El Capitan,python 2.7.10。我愿意使用另一种编程语言,只要它运行并将keypress信息发送到此python文件即可。这是我的代码:
import Tkinter
root = Tkinter.Tk()
U = False
Udone = True
def Ustart():
global Udone
Udone = True
def Press(event):
global U
global Udone
U = True
Udone = False
print("True")
root.after(300, Ustart)
def Release(event):
global U
global Udone
if Udone:
U = False
print("False")
root.bind("u", Press)
root.bind("<KeyRelease-u>", Release)
root.mainloop()
答案 0 :(得分:1)
对不起,我回答这个问题太晚了,但我仍然认为这很重要。经过多年的搜索,我现在才发现了答案。首先需要了解一些事情(尽管这不是完整列表,因为您使用的是 Python 2):
解决方案是下载并构建 Tk 8.5 最新版本 (https://github.com/tcltk/tk/releases/tag/core-8-5-19) 的源版本,但以与 Tk 开发人员相同的方式修改文件 tkMacOSXKeyEvent.c 以修复故障(提交在这里:https://github.com/tcltk/tk/commit/797282fc2929c8427bd830748d7b08ea022c1177)。
答案 1 :(得分:0)
这也很有效,至少在我的Linux系统上是这样。请注意,打印循环与set_the_variable函数是分开的。
import Tkinter
import os
os.system('xset r off')
class KeyRepeat():
def __init__(self, root):
root.bind("u", self.press)
root.bind("<KeyRelease-u>", self.release)
self.check_key=True
Tkinter.Button(root, text="Exit", command=root.quit, bg="orange").grid()
def press(self, event=None):
self.check_key=True
self.print_result()
def print_result(self):
if self.check_key:
print("True")
root.after(300, self.print_result)
def release(self, event):
self.check_key=False
print("False")
root = Tkinter.Tk()
K=KeyRepeat(root)
root.mainloop()
os.system('xset r on')