2013-07-26 100 views
1

我有一個執行函數的按鈕(在tkinter中)。比方說,它增加了視頻遊戲的資金。所以當你按下那個按鈕時,你會得到100美元。但是,我只希望我的用戶能夠每分鐘增加100美元一次。有沒有辦法讓一個函數每分鐘被調用一次? (?也許隨着時間的模塊或東西)如何讓一個函數只能在python/tkinter中每分鐘調用一次?

我知道在功能管理時間最多的就是這一點,我想沿着這些線路做一些事情:

def add_money(): 
money = money + 100 
app.after(5000, add_money) 

我知道,這個功能會顯然沒有得到我想要的。有沒有一種方法來實現它,所以如果你點擊按鈕,一分鐘沒有通過,程序將無能爲力?

在此先感謝

+0

[在TKinter中的python GUI中編寫一個計時器的代碼](http://stackoverflow.com/questions/2400262/code-a-timer-in-a-python-gui-in-tkinter)和所有其他人則搜索「tkinter」和「timer」。 – tom10

+0

我不認爲這是計時器選項的重複。這個問題是關於如何在一段時間內禁用功能。儘管使用與定時器相同的機制完成了這項工作,但值得一提的是,值得一提的是IMO。 –

回答

1

只跟蹤時間你自己,如果時間過去了,就什麼也不做。

def add_money(): 
    curr_time = int(time.time()) 
    if curr_time - app.last_time > 60: 
     app.last_time = curr_time 
     money = money + 100 

這樣,函數可以像用戶喜歡的那樣經常調用,但它只會每分鐘做一次他想做的事。

1

我真的很可能實現這個作爲裝飾,因爲它聽起來像可重用的東西。下面示例允許你在你想要的任何功能重用guarded,指定的超時時間(以秒計)爲每次使用裝飾上功能:

import time 
from functools import wraps 

_guards = {} 

def guarded(tm): 
    def wrapper(fn): 
     _guards[fn] = {'timeout': tm} 
     @wraps(fn) 
     def inner(*args, **kwargs): 
      t = time.time() 
      if 'last' not in _guards[fn] or \ 
       t - _guards[fn]['last'] > _guards[fn]['timeout']: 
       _guards[fn]['last'] = t 
       fn(*args, **kwargs) 

     return inner 
    return wrapper 

money = 0 
@guarded(2) 
def add_money(): 
    global money 
    money += 100 
    print money 

這裏,add_money僅2秒超時之後允許:

In [2]: add_money() 
100 
In [3]: add_money() 
In [4]: add_money() 
200 
In [5]: add_money() 
In [6]: add_money() 
In [7]: add_money() 
In [8]: add_money() 
300 

是的,有不使用全球字典來追蹤這個東西(壞的運行時多線程),並使用threading.local而不是爭論,但還有點兒這個答案的範圍之內。

+0

雖然這是功能性的,但從用戶體驗的角度來看,這不是一個好的解決方案。除了禁止該功能外,用戶界面還應提供某種反饋 - 禁用該按鈕或顯示一條消息,表明該操作不允許,等等。所以,雖然裝飾器很有趣,但我認爲它可能很難使用(或重新使用),如果您想在功能被禁用時執行一些UI操作。 –

1

在add_money功能,禁用「加錢」按鈕,然後安排其在一分鐘後重新啓用到:

def add_money(): 
    <do the real work here> 

    add_money_button.configure(state="disabled") 
    root.after(60000, lambda: add_money_button.configure(state="normal")) 

如果您的應用程序有多種方式來加錢,如菜單項,按鈕和加速鍵創建啓用或禁用所有這些項目的功能,然後通過after調用該功能。

相關問題