如何在python / tkinter中只允许每分钟调用一次函数?

时间:2013-07-26 19:05:27

标签: python user-interface python-2.7 tkinter

我有一个执行功能的按钮(在tkinter中)。让我们说它在视频游戏中增加了钱。因此,当您按下该按钮时,您将获得100美元。但是,我只希望我的用户能够每分钟增加100美元。有没有办法只允许每分钟调用一次函数? (也许有时间模块或什么?)

我对函数管理时间的了解最多,我想在这些方面做点什么:

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

我知道这个功能显然不会得到我想要的东西。有没有办法实现它,这样如果你点击按钮并且没有通过一分钟,程序什么都不做?

提前致谢

3 个答案:

答案 0 :(得分: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 :(得分: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,但这有点超出了这个答案的范围。

答案 2 :(得分: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调用该功能。