【问题标题】:How can I control keyboard repeat delay in a Tkinter root window?如何在 Tkinter 根窗口中控制键盘重复延迟?
【发布时间】:2012-10-11 06:44:27
【问题描述】:

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

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)

【问题讨论】:

标签: python user-interface keyboard tkinter tk


【解决方案1】:

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

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

函数看起来像这样:

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

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

【讨论】:

  • 谢谢,有道理。知道 Spinbox 上的 repeatdelay 和 repeatinterval 选项有什么作用吗?
  • @Andrew:他们控制鼠标按钮按下的重复速度。由于按住鼠标按钮时鼠标不会发送多个按钮按下,因此 tkinter 本身必须支持此功能。它仅在一些小部件中支持它,因为重复的鼠标按钮按下通常不会发生。然而,对于滚动条和旋转框,这是一个有用的功能。
  • 在 X11 上,您可以使用 xset 实用程序在系统级别控制键盘重复参数。许多操作系统也有图形方式来设置这种功能。
【解决方案2】:

以下是基于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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多