Mac上的Python Tkinter:为什么我无法检测到按键何时被按下?

时间:2016-05-07 18:29:27

标签: python macos python-2.7 tkinter keypress

我正在尝试用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()

2 个答案:

答案 0 :(得分:1)

对不起,我回答这个问题太晚了,但我仍然认为这很重要。经过多年的搜索,我现在才发现了答案。首先需要了解一些事情(尽管这不是完整列表,因为您使用的是 Python 2):

  • 这不是 Tkinter(Tcl/Tk 的 Python 包装器)的错误,而是 Tk 本身的错误
  • 此错误实际上已在 2018 年在更高版本的 Tk 8.6 中修复
  • 但是,Python 2 只会与 Tk 8.5 或更低版本动态链接
  • Mac OS X 内置 Tk 8.5.9 不包含此错误(与我见过的所有其他 Tk 8.5 发行版不同),但包含其他致命错误,因此请勿使用它

解决方案是下载并构建 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')