1

我有一个执行功能的按钮(在 tkinter 中)。假设它在视频游戏中增加了资金。所以当你按下那个按钮时,你会得到 100 美元。但是,我只希望我的用户能够每分钟添加 100 美元。有没有办法只允许每分钟调用一次函数?(也许与时间模块或什么?)

我对在函数中管理时间的了解最多的是,我想按照以下方式做一些事情:

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

我知道这个功能显然不会得到我想要的。有没有办法实现它,如果您单击按钮并且没有经过一分钟,程序将什么也不做?

提前致谢

4

3 回答 3

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

是的,有一些争论不使用全局 dict 来跟踪这些东西(运行多线程时不好)threading.local而是使用,但这有点超出了这个答案的范围。

于 2013-07-26T19:24:50.800 回答
1

自己跟踪时间,如果时间太短,什么也不做。

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

这样,该函数可以根据用户的喜好多次调用,但它每分钟只会执行一次他想要的操作。

于 2013-07-26T19:11:11.480 回答
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

于 2013-08-28T22:25:52.977 回答