我有一个执行功能的按钮(在tkinter中)。让我们说它在视频游戏中增加了钱。因此,当您按下该按钮时,您将获得100美元。但是,我只希望我的用户能够每分钟增加100美元。有没有办法只允许每分钟调用一次函数? (也许有时间模块或什么?)
我对函数管理时间的了解最多,我想在这些方面做点什么:
def add_money():
money = money + 100
app.after(5000, add_money)
我知道这个功能显然不会得到我想要的东西。有没有办法实现它,这样如果你点击按钮并且没有通过一分钟,程序什么都不做?
提前致谢
答案 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
调用该功能。