2

这个简单的应用程序几乎可以满足我的要求:

import Tkinter as Tk

def hello(x):
    print "Hello"

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

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

我知道其他 Tkinter 小部件具有“repeatdelay”和“repeatinterval”的配置选项,但我似乎找不到 Tkinter 根窗口的配置选项。

(我在看你的方向,布莱恩·奥克利

4

2 回答 2

6

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

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

该函数看起来像这样:

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

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

于 2012-10-21T05:45:42.387 回答
1

以下是基于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()
于 2018-01-23T05:53:49.913 回答