我有以下代码:
def countdown():
def countdown1():
print 'countdown1'
def countdown2():
def countdown3():
takePic()
self.pic.set_markup("<span size='54000'>1</span>");
print 1
t3 = Timer(1.0, countdown3)
t3.start()
self.pic.set_markup("<span size='54000'>2</span>");
print 2
t2 = Timer(1.0, countdown2)
t2.start()
self.pic.set_markup("<span size='54000'>3</span>");
print 3
t1 = Timer(1.0, countdown1)
t1.start()
countdown()
它应显示从3倒计时。数字3出现,但之后没有任何反应。帮助
答案 0 :(得分:2)
你的主线程可能会在任何计时器开火之前退出。解决这个问题的最简单和最原始的方法是让主线程在必要时休眠。一个更健全的选择是在countdown3
的末尾发出类似信号量的信号,并在主线程中等待它。
一个更优雅的解决方案,可以与更广泛的调度和异步框架集成,是使用生成器来反转控制流程:
def countdown():
self.pic.set_markup("<span size='54000'>3</span>");
print 3
yield 1.0
print 'countdown1'
self.pic.set_markup("<span size='54000'>2</span>");
print 2
yield 1.0
self.pic.set_markup("<span size='54000'>1</span>");
print 1
yield 1.0
takePic()
for t in countdown():
time.sleep(t)
答案 1 :(得分:1)
为什么在.join()
之后只有.start()
你的计时器线程,以便其余的代码等到计时器完成后再继续?
答案 2 :(得分:0)
您确定其他命令没有阻止吗?像set_markup
一样?一个简化的例子对我有用:
>>> from threading import Timer
>>> def lvl1():
def lvl2():
print "evaling lvl2"
def lvl3():
print "evaling lvl3"
print "TakePic()"
print 1
t3 = Timer(1.0, lvl3)
t3.start()
print 2
t2 = Timer(2.0, lvl2)
t2.start()
>>> lvl1()
2
>>> evaling lvl2
1
evaling lvl3
TakePic()