2010-07-12 73 views
1

我正在用Tkinter編寫我的第一個GUI程序(實際上也是Python中的第一個程序)。我想限制Tkinter回調的運行頻率

我有一個用於搜索的Entry小部件,結果轉到一個Listbox。我想要的結果更新爲用戶類型,所以我做了這樣的回調:

search_field.bind("<KeyRelease>", update_results) 

的問題是在一排更新搜索了很多次。由於結果將來自數據庫查詢,因此會產生大量不必要的流量。我真正想要的是每秒更新一次,或者在用戶停止鍵入然後搜索後等待一秒鐘。最簡單的方法是什麼? 謝謝

更新:這對我所描述的很好,但現在我意識到我也需要在用戶停止鍵入後觸發更新。否則,最後幾個字符從不包含在搜索中。我想我有未接受的答案,以便該回去到的問題清單...

回答

2

一個很好的方式做,這是一個簡單的緩存裝飾:

import time 
def limit_rate(delay=1.0): 
    """ produces a decorator that will call a function only once per `delay` """ 
    def wrapper(func): # the actual decorator 
     cache = dict(next = 0) # cache the result and time 
     def limited(*args, **kwargs): 
      if time.time() > cache['next']: # is it time to call again 
       cache['result'] = func(*args, **kwargs) # do the function 
       cache['next'] = time.time() + delay # dont call before this time 
      return cache['result'] 
     return limited 
    return wrapper 

它的工作原理像這樣:

@limit_rate(1.5) 
def test(): 
    print "Called test()" 
    time.sleep(1) 
    return int(time.time()) 

print [test() for _ in range(5)] # test is called just once 

只需將某處添加此裝飾,並用它裝飾你的update_results功能。

0

想通了。我使用any_widget.after(delay_in_ms,function)延遲調用裝飾後的函數。