繁体   English   中英

Python每秒调用一个函数吗?

[英]Python call a function every second?

我有一个为第一个项目编写的游戏,并且我希望有一个可以玩和暂停游戏的系统。 当您单击取消暂停按钮时,我希望它每隔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

一切正常,直到我第三次按下按钮。 有谁知道我可以重新启动线程的方法,或者可以使用其他方法来执行我想要的操作?

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

尽管可以解决此问题,但是有更简单的方法可以做到这一点。

一方面,您似乎在这里使用某种GUI或游戏框架。 我不知道您使用的是哪一个,但是几乎每个人都有一个执行计时器的功能(在主事件循环中,而不是在单独的线程中,但这不是关键),更多比threading.Thread强大—特别是,它可以每秒自动重复一次,直到被取消为止。 这显然会使您的生活更轻松。

如果不是这样,编写自己的重复Timer在PyPI上找到一个很容易。 请注意, threading文档以指向源代码的链接开头。 这是因为,与stdlib中的许多模块一样, threading被编写为简单易懂的代码,并在自身有用的基础上充当示例代码。 特别地, Timer非常简单,如何扩展它应该很明显:只需在run方法周围放置一个循环即可。

在函数开始时,您每次都要设置一个新的全局变量和一个计时器:

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可以改善代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM