我有一个我为第一个项目编写的游戏,我希望有一个可以玩游戏并暂停游戏的系统。当您单击“取消暂停”按钮时,我希望它每隔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
一切顺利,直到我第三次按下按钮。有没有人知道我可以重新启动线程的方法,或者使用不同的方法来做我想做的事情?
答案 0 :(得分:0)
如果没有看到其他代码,很难确定问题出在哪里,但我的猜测是,有时,当您点击按钮时,ispaused
为1
,但是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来改进你的代码。