2016-11-08 2 views
0

при попытке создать таймер обратного отсчета, у меня возникла проблема. Я основывался на коде Bryan Oakleys (Making a countdown timer with Python and Tkinter?). Я не опубликовал весь код, потому что это было бы довольно долго.Tkinter - код выполняется без ответа tkinter

То, что я хочу, чтобы мой код, чтобы сделать:

Подождите й количество секунд, хранящийся в Wait и собранная записью Уэйта. Далее, я хочу, чтобы wait_button вызывал обратный отсчет. Этот класс создаст метку в своем собственном окне tkinter. После обратного отсчета (= задержка в течение шести секунд) основная функция будет вызвана и изменит поток.

Что он делает:

код выполняется без ошибок. Обратный отсчет имеет место, и потоки изменены, но без второй задержки и без открытия окна tkinter.

Любая помощь была бы оценена, я посмотрел на сайт, но не нашел ничего, что действительно помогло бы решить мою проблему.

Стейн

def Wait_button(self): 
    """This is part of a larger tkinter grid and is called after pushing a button""" 
    """Wait for a set ammount of time before changing""" 
    self.Flow = self.Collect() 
    self.WaitE = int(self.WaitE.get()) 
    Countdown(self.Flow, self.WaitE) 
    return() 

class Countdown(): 

    def __init__(self, Flow, WaitE): 

     self.master = Tk() 
     self.label = Label(self.master, text="", width=10) 
     self.label.pack() 
     self.remaining = WaitE 
     self.Flow = Flow 
     self.counting(Flow, self.remaining) 

    def counting(self, Flow, remaining = None): 

     print(Flow, "after init") 
     if remaining is not None: 
      self.remaining = remaining 

     if int(self.remaining) <= 0: 
      self.master.destroy() 
      Go = AskInput(root) 
      Go.Change_now(Flow) 

     else: 
      print(self.remaining, "-1") 
      self.label.configure(text="%d" % self.remaining) 
      self.remaining = self.remaining - 1 
      self.label.after(1000, self.counting(self.Flow)) 
+1

Попробуйте заменить строку с '' after' с self.label.after (1000, lambda: self.counting (self.Flow)) '. – TigerhawkT3

+0

Отлично! Оно работает. Можете ли вы объяснить важность лампы в этом случае? –

+1

@ TigerhawkT3: вам не нужно использовать 'lambda' с' after': вы можете передать аргументы: 'self.label.after (1000, self.counting, self.Flow)' –

ответ

0

решаемые TigerhawkT3.

"Попробуйте заменить линию после того, как с self.label.after (1000, лямбда: self.counting (self.Flow))"

+1

Вам не нужно используйте лямбда, он просто добавляет излишнюю сложность. Вы можете напрямую передавать аргументы из вызова функции: 'self.label.after (1000, self.counting, self.Flow)' –

+0

Спасибо, Брайан. Ваши ответы на SO уже помогли мне несколько раз. –

+0

В конце ответ очень прост, но я его не видел. –

Смежные вопросы