2012-10-21 34 views
2

這個簡單的應用程序幾乎做什麼,我想:如何控制Tkinter根窗口中的鍵盤重複延遲?

import Tkinter as Tk 

def hello(x): 
    print "Hello" 

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

我搗碎向下向上箭頭,它打印「你好」一遍又一遍。然而,在重複開始之前有一段延遲,重複頻率比我想要的要慢。 如何將此重複延遲設置爲零?我如何控制重複間隔?

我知道其他Tkinter窗口小部件有'repeatdelay'和'repeatinterval'的配置選項,但我似乎無法找到一個用於Tkinter根窗口的配置選項。

(我期待你的方向,Bryan Oakley

+1

否則在[repeatdelay站點:http://www.tcl.tk/man/tcl8.4]谷歌搜索(HTTPS:// WWW .google.com /查詢q = Tkinter的+ repeatdelay#HL = EN&sclient = PSY-AB&q = + repeatdelay +網站:HTTP%3A%2F%2Fwww.tcl.tk%2Fman%2Ftcl8.4&OQ = + repeatdelay +站點:http %3A%2F%2Fwww.tcl.tk%2Fman%2Ftcl8.4&gs_l = serp.3 ... 1892959.1898850.0.1900214.8.8.0.0.0.0.506.1838.1j3j2j1j0j1.8.0.les%3B..0.0 ... 1c上。 1.cxVH0ELY7uc&PBX = 1&BAV = on.2,or.r_gc.r_pw.r_cp.r_qf。&FP = 3709cc8b571c5c16&BPCL = 35466521&BIW = 1280&波黑= 917)示出了repeatdelay只屬於小部件,而不是窗口。 –

回答

6

這不是Tk的東西配置 - TK擁有多快的鍵盤驅動程序發送重複按鍵事件沒有控制權。

你可以做的反而是對按鈕按下並釋放鍵設置,然後取消設置標誌綁定。然後,你可以寫,做任何你想要它做一個函數,然後檢查標誌和任何耽誤您想後再次調用自身。

功能會是這個樣子:

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

要做到這一點權要求多一點點的邏輯,但那是一般的想法。

+0

謝謝,這是有道理的。任何想法Spinbox上的'repeatdelay'和'repeatinterval'選項都可以做什麼? – Andrew

+0

@Andrew:他們控制鼠標按下按鈕的速度有多快重複。由於鼠標按下按鈕時不會發送多個按鈕,因此tkinter必須自行支持該功能。它只支持它在一些小部件,因爲重複的鼠標按鍵不是通常應該發生的事情。但是,對於滾動條和旋轉框,它是一個有用的功能。 –

+1

在X11上,您可以控制在與'xset'實用的系統級鍵盤重複參數。許多操作系統都有圖形化的方法來設置這種功能。 –

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