Python tkinter time.sleep()

Luc*_*s N 1 python sleep tkinter

为什么我运行我的代码,它会先睡3秒,然后执行'label'.lift()并更改文本?这只是该计划中许多人的一项功能.我希望标签上写着"从3 ... 2 ...... 1开始...",当第二个过去时,数字会改变.

def predraw(self):
    self.lost=False
    self.lossmessage.lower()
    self.countdown.lift()
    self.dx=20
    self.dy=0
    self.delay=200
    self.x=300
    self.y=300
    self.foodx=self.list[random.randint(0,29)]
    self.foody=self.list[random.randint(0,29)]
    self.fillcol='blue'
    self.canvas['bg']='white'
    self.lossmessage['text']='You lost! :('
    self.score['text']=0
    self.countdown['text']='Starting in...3'
    time.sleep(1)
    self.countdown['text']='Starting in...2'
    time.sleep(1)
    self.countdown['text']='Starting in...1'
    time.sleep(1)
    self.countdown.lower()
    self.drawsnake()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 5

这样做是因为当UI进入事件循环时,窗口小部件的更改才会变为可见.每次调用睡眠后都不允许屏幕更新,因此在更改任何内容之前它似乎已经睡了三秒钟.

一个简单的解决方法是在呼叫self.update()之前立即呼叫time.sleep(1),但更好的解决方案是根本不呼叫sleep.你可以做这样的事情,例如:

self.after(1000, lambda: self.countdown.configure(text="Starting in...3"))
self.after(2000, lambda: self.countdown.configure(text="Starting in...2"))
self.after(3000, lambda: self.countdown.configure(text="Starting in...1"))
self.after(4000, self.drawsnake)
Run Code Online (Sandbox Code Playgroud)

通过after以这种方式使用,您的GUI在等待时间内保持响应,并且您不必进行呼叫update.