[英]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
一切正常,直到我第三次按下按钮。 有谁知道我可以重新启动线程的方法,或者可以使用其他方法来执行我想要的操作?
没有看到其余的代码,很难确定问题出在哪里,但是我的猜测是,有时,当您单击按钮时, ispaused
为1
,但是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.