Окно Tkinter говорит (не отвечает), но код работает

У меня есть программа, которая выполняет длительный процесс после нажатия кнопки действия. По мере запуска процесса корневое окно скажет, что оно не отвечает, хотя я знаю, что программа работает в фоновом режиме. Эта программа будет выпущена для нескольких людей, с которыми я работаю, и я хочу убедиться, что они не волнуются и закрывают окно, когда видят это. Решение, которое у меня есть, – это сидение root.update в цикле процесса, который работает, но я не уверен, что это лучшее решение.

Использование python 3.3

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

def combine(boxes_to, boxes_from, frame): to_value,to_pos = gui.checkBoxes(boxes_to) from_value,from_pos = gui.checkBoxes(boxes_from) frame.destroy() running = Label(root,text="Running please do not close..",font = (16)) running.pack() root.update() map_to = open("map_to",'r') for line in map_to: root.update() process(line) running.destroy() map_to.close() finish = Button(root, text="Done",command=gui.stop) finish.pack() 

One Solution collect form web for “Окно Tkinter говорит (не отвечает), но код работает”

Хотя вы можете вызвать root.update () в своем цикле, это все равно приведет к некоторым (потенциально) нежелательным побочным эффектам.

  1. Программа может действовать лагги, то есть требуется много времени для ответа на ввод пользователя.
  2. Вы можете выполнить только одно действие. Любые другие действия должны дождаться завершения этого.

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

Если ваше приложение тривиально параллелизуемо, вы можете использовать несколько потоков для уменьшения времени выполнения. Ex. Thread 1 обрабатывает записи 1-100, а поток 2 обрабатывает записи 101-200.

Python - лучший язык программирования в мире.