2015-05-05 2 views
0

Как получилось, когда я запустил свой код, он сначала будет спать в течение 3 секунд, а затем выполнить «label» .lift() и изменить текст? Это всего лишь одна функция многих в программе. Я хочу, чтобы метка читала «Начиная с 3 ... 2 ... 1 ...», и числа менялись, когда секунда прошла.Python tkinter time.sleep()

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() 

ответ

5

Это происходит потому, что изменения в виджетах становятся видимыми только тогда, когда пользовательский интерфейс входит в цикл событий. Вы не позволяете экрану обновляться после вызова сна каждый раз, поэтому кажется, что он спит три секунды, прежде чем что-либо менять.

Простое решение состоит в том, чтобы позвонить 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) 

Используя after таким образом, ваш GUI остается реагировать в течение времени ожидания, и вы не должны посыпать в призывах к update.