如何在Tkinter根窗口中控制键盘重复延迟?

3
这个简单的应用程序几乎可以满足我的需求:
import Tkinter as Tk

def hello(x):
    print "Hello"

root = Tk.Tk()
root.bind("<Up>", hello)
root.mainloop()

我按下向上箭头键,它一遍又一遍地打印“Hello”。然而,在这种重复开始之前会有一定的延迟,并且重复速率比我想要的慢。我如何将此重复延迟设置为零?我如何控制重复间隔? 我知道其他Tkinter小部件有“repeatdelay”和“repeatinterval”的配置选项,但是我似乎找不到Tkinter根窗口的配置选项。
(我在看着你,Bryan Oakley

1
在Google上搜索repeatdelay site:http://www.tcl.tk/man/tcl8.4发现repeatdelay仅属于小部件,而不是窗口。 - Steven Rumbalski
2个回答

6
这不是Tk可以配置的内容——Tk无法控制键盘驱动程序发送重复按键事件的速度。
相反,你可以在按钮按下和释放时绑定设置和取消一个标志。然后,你可以编写一个函数来执行任何你想要的操作,然后检查标志并在你想要的延迟之后再次调用自己。
该函数将类似于以下内容:
def hello(x):
    global SHOULD_REPEAT
    print "hello"
    if SHOULD_REPEAT:
        root.after(10, hello) # wait 10ms then repeat

要做到这一点需要更多的逻辑,但这是一般的想法。

谢谢,那很有道理。你知道 Spinbox 上的 repeatdelayrepeatinterval 选项是做什么用的吗? - Andrew
1
@Andrew:它们控制鼠标按钮按下重复的速度。由于当您按住鼠标按钮时,鼠标不会发送多个按钮按下,因此tkinter必须自己支持此功能。它仅在少数小部件中支持此功能,因为通常不应该发生重复的鼠标按钮按下。但是,对于滚动条和微调框,这是一个有用的功能。 - Bryan Oakley
1
在X11上,您可以使用xset实用程序在系统级别控制键盘重复参数。许多操作系统也有图形方式来设置这种功能。 - Donal Fellows

2
以下是一个完整的示例,基于Bryan在这篇帖子中的答案
try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


def step(*event):
    label['text'] += 1


    if label._repeat_on:
        root.after(label._repeat_freq, step)


def stop(*event):
    if label._repeat_on:
        label._repeat_on = False
        root.after(label._repeat_freq + 1, stop)
    else:
        label._repeat_on = True


if __name__ == '__main__':
    root = tk.Tk()
    label = tk.Label(root, text=0)
    label._repeat_freq = 10
    label._repeat_on = True

    root.bind('<KeyPress-s>', step)
    root.bind('<KeyRelease-s>', stop)

    label.pack()
    root.mainloop()

谢谢。现在我只需要找到一种将其应用于海龟图形的方法 :) - SadSack963
找到啦!对于像我一样正在寻找在海龟绘图中实现快速按键重复的方法的人,请看一下这个帖子中的最后一个回答:https://stackoverflow.com/questions/44863600/turtle-graphics-keypress-event-not-repeating - SadSack963

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接