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

时间:2012-10-21 03:49:32

标签: python user-interface keyboard tkinter tk

这个简单的应用程序几乎做了我想要的事情:

import Tkinter as Tk

def hello(x):
    print "Hello"

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

我将向上箭头捣碎,一遍又一遍地打印“你好”。但是,在重复开始之前有一段延迟,重复率比我想要的慢。 如何将此重复延迟设置为零?如何控制重复间隔?

我知道其他Tkinter小部件有'repeatdelay'和'repeatinterval'的配置选项,但我似乎无法找到一个用于Tkinter根窗口。

(我正朝着你的方向,Bryan Oakley

2 个答案:

答案 0 :(得分:6)

这不是Tk中可配置的东西--Tk无法控制键盘驱动程序发送重复键事件的速度。

你可以做的是按下按钮和按钮释放以设置然后取消设置标志。然后,您可以编写一个函数来执行您想要的任何操作,然后检查该标志并在您想要的任何延迟后再次调用自己。

该功能看起来像这样:

def hello(x):
    global SHOULD_REPEAT
    print "hello"
    if SHOULD_REPEAT:
        root.after(10, hello) # wait 10ms then repeat

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

答案 1 :(得分:1)

以下是基于Bryan's answer in this post的完整示例:

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()