Python每秒调用一个函数?

时间:2014-10-28 19:05:54

标签: python multithreading timer

我有一个我为第一个项目编写的游戏,我希望有一个可以玩游戏并暂停游戏的系统。当您单击“取消暂停”按钮时,我希望它每隔1秒调用一次函数来推进日期。 Time.sleep会停止整个程序,因此它对我没用,我似乎无法在启动后重新启动线程。这是推进日功能。

def time():
    global timer
    timer = threading.Timer(1.0, time)
    timer.start()
    thirtyonemonths = [1, 3, 5, 7, 8, 10, 12]
    thirtymonths = [4, 6, 9, 11]
    globalvars.day = globalvars.day + 1
    for self in thirtyonemonths:
        if self == globalvars.month:
            print "hi"
            if globalvars.day == 32:
                globalvars.day = 1
                globalvars.month = globalvars.month + 1
    for self in thirtymonths:
        if self == globalvars.month:
            print "hi"
            if globalvars.day == 31:
                globalvars.day = 1
                globalvars.month = globalvars.month + 1
    if globalvars.month == 2:
        print "hi"
        if globalvars.day == 29:
            globalvars.day = 1
            globalvars.month = globalvars.month + 1
    if globalvars.month == 13:
        globalvars.month = 1
        globalvars.year = globalvars.year + 1
    threading.Thread.time(self)
timer = threading.Timer(1.0, time)

稍后我有点击按钮的代码,检查它是否暂停

if b.collidepoint(pos):
    if globalvars.ispaused == 1:
        globalvars.ispaused = 0
        timer.start()
        break
    if globalvars.ispaused == 0:
        globalvars.ispaused = 1
        timer.cancel()
        break

一切顺利,直到我第三次按下按钮。有没有人知道我可以重新启动线程的方法,或者使用不同的方法来做我想做的事情?

2 个答案:

答案 0 :(得分:0)

如果没有看到其他代码,很难确定问题出在哪里,但我的猜测是,有时,当您点击按钮时,ispaused1 ,但是timer是一个过期的计时器,而不是暂停的计时器。在过期的计时器上调用start无效。

虽然可以修复,但有更简单的方法可以解决这个问题。

首先,看起来你在这里使用某种GUI或游戏框架。我不知道你正在使用哪一个,但几乎每个人都有一个定时器的功能(在主事件循环中,而不是在一个单独的线程中,但这不是关键这里的东西比threading.Thread更强大 - 特别是,它可以自动重复每秒直到被取消。这显然会让你的生活更轻松。

如果没有,那么编写自己的重复Timer或仅find one on PyPI非常容易。请注意,threading文档以the source code的链接开头。这是因为,与stdlib中的许多模块一样,threading被编写为简单易懂,在其自身有用的基础上充当示例代码。特别是,Timer很简单,如何扩展它应该非常明显:只需在run方法周围放一个循环。

答案 1 :(得分:0)

在您的功能开始时,您每次都设置一个新的全局和计时器:

global timer
timer = threading.Timer(1.0, time)
timer.start()

然后在功能结束时,您需要threading.Thread.time(self),这是不需要的,需要删除。然后在函数声明之后你有timer = threading.Timer(1.0, time)这可能是一个错误,因为当它第一次被调用时,可能还没有创建全局计时器。用time()替换最后一行代码,以便第一次立即调用该函数。更改这两行可能会使代码足够好。

另外,你有这样的for循环:

for self in thirtyonemonths:

,问题在于使用关键字self。如果在类中定义了此函数,则self的这种使用可能被解释为对象的引用。通常最好不要使用self之类的关键字作为迭代器。用其他东西替换self的所有用法,比如m来改进你的代码。