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

2024-05-16 20:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个按钮可以执行一个函数(在tkinter中)。让我们假设它在游戏中增加了金钱。所以当你按下那个按钮,你会得到100美元。然而,我只希望我的用户能够每分钟增加100美元。有没有办法一分钟只允许调用一次函数?(也许是时间模块之类的?)在

我对管理职能部门的时间最了解的是,我想按照以下思路做些事情:

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

我知道这个函数显然不能得到我想要的。有没有一种方法可以实现它,如果你点击按钮,一分钟都没有过去,程序将什么也不做?在

提前谢谢


Tags: 模块函数用户add游戏tkinterdef时间
3条回答

你自己跟踪时间,如果时间过得太少,什么也不做。在

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

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

在“添加货币”功能中,禁用“添加货币”按钮,然后计划在一分钟后重新启用:

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调用该函数。在

实际上,我很可能将其作为一个装饰器来实现,因为它听起来像是可重用的东西。下面的示例允许您在所需的任何函数上重用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秒超时后才允许:

^{pr2}$

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

相关问题 更多 >