Windows думает, что tkinter не отвечает

У меня есть небольшое приложение на python, которое прекрасно работает, за исключением этой незначительной проблемы: он должен запускать цикл непрерывно, пока пользователь не сообщит об этом остановить через кнопку, но когда я нажму кнопку запуска, окна подскажут, что он не отвечает. Теперь, если я пишу простой отчет о печати, все работает нормально:

def update(self): self.bStart.config(state = 'disabled') self.bStop.config(state = 'active') self.running = True self.toRun = True while self.toRun: [...do some stuff...] time.sleep(self.toWait) print("i'm alive") 

однако без заявления печати он просто зависает и переходит к «не реагированию», и я блуждаю, есть ли способ предотвратить это.

  • Цвет окна по умолчанию Tkinter и шестнадцатеричные цветовые коды
  • Как создать прозрачные виджеты с помощью Tkinter?
  • Tkinter, выполняющий функции с течением времени
  • Виджет Python Tkinter для ноутбуков
  • Как я могу идентифицировать кнопки, созданные в цикле?
  • Как периодически запускать функцию в python
  • Создание единого EXE с использованием py2exe для программы Tkinter
  • Позиция мыши Python Tkinter
  • One Solution collect form web for “Windows думает, что tkinter не отвечает”

    Как правило, вы не должны вызывать sleep в графическом интерфейсе, и у вас не должно быть циклов, которые обновляют отображение. Если вы периодически обновляете дисплей, правильное использование after делает цикл ненужным.

    Общая идея состоит в том, чтобы написать функцию, которая делает одно обновление (то есть: что вы в противном случае имели бы как тело цикла). Затем, эта функция вызовет себя через after .

    Вот пример, где вы можете видеть, что гистограмма растет со временем, не используя цикл:

     import Tkinter as tk class Example(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent) self.canvas = tk.Canvas(self) self.start_button = tk.Button(self, text="start", command=self.on_start) self.stop_button = tk.Button(self, text="stop", command=self.on_stop) self.start_button.pack() self.stop_button.pack() self.canvas.pack(fill="both", expand=True) # call on_stop to initialize the state of the buttons self.on_stop() def on_start(self): """Start the animation""" self.canvas.delete("all") self.rect_id = self.canvas.create_rectangle(0,0,1,20, fill="blue") self.running = True self.start_button.configure(state="disabled") self.stop_button.configure(state="normal") self.draw_one_frame() def on_stop(self): """Stop the animation""" self.start_button.configure(state="normal") self.stop_button.configure(state="disabled") self.running = False def draw_one_frame(self): """Draw a single frame of animation""" (x0, y0, x1, y1) = self.canvas.coords(self.rect_id) if x1 < self.canvas.winfo_width(): x1 += 1 else: x1 = 1 self.canvas.coords(self.rect_id, (x0, y0, x1, y1)) if self.running: self.after(10, self.draw_one_frame) if __name__ == "__main__": root = tk.Tk() Example(root).pack(fill="both", expand=True) root.mainloop() 
    Interesting Posts
    Python - лучший язык программирования в мире.