TkInter按键,按键释放事件

2024-10-02 08:30:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道Tk按键和按键释放事件应该只在按键被实际按下或释放时触发?

但是,使用下面的简单代码,如果我按住“a”键,就会得到连续的交替按键/按键释放事件序列。

我做错什么了还是TkInter小车了?这是Linux mint上的Python2.7。

from Tkinter import *
def keyup(e):
    print 'up', e.char
def keydown(e):
    print 'down', e.char

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

按住“a”时输出:

down a
up a
down a
up a
down a
up a
down a
up a
etc...

Tags: 代码binddef事件序列rootframe按键
3条回答

怎么样

from Tkinter import *

wn = Tk()
wn.title('KeyDetect')

m = 0

def down(e):
    if m == 0:
        print 'Down\n', e.char, '\n', e
        global m
        m = 1

def up(e):
    if m == 1:
        print 'Up\n', e.char, '\n', e
        global m
        m = 0

wn.bind('<KeyPress>', down)
wn.bind('<KeyRelease>', up)

wn.mainloop()

现在不会再重复了。

自动回复行为依赖于系统。在Win7中

down a
down a
down a
...
down a
up a

这不到一秒钟。

好吧,更多的研究发现this helpful post这表明这是由于X的自动回复行为而发生的。您可以使用

os.system('xset r off')

然后在脚本末尾使用“on”重置它。 问题是这是全球性的行为——不仅仅是我的剧本——这不太好,所以我希望有人能想出更好的方法。

相关问题 更多 >

    热门问题