H.E.P -
Традиционный способ сделать это действительно включает использование отдельного потока и координацию работы между «рабочим» потоком и потоком GUI с использованием какого-либо механизма опроса или обработки событий.
Но, как отмечает Томас К., это может стать очень сложным и хитрым, особенно в том, что касается использования в Python глобальной блокировки интерпретатора (GIL) и т. Д., А также в случае необходимости бороться с циклом обработки Tkinter.
(Единственная веская причина для использования многопоточного GUI - это если вы абсолютно ДОЛЖНЫ гарантировать, что GUI останется отзывчивым во время потенциально длительной фоновой задачи, что, я не думаю, является проблемой в этом случае.)
Вместо этого я бы предложил основанную на генераторе «параллельную» архитектуру.
Как отмечено в «Справочнике по языку Python (2.7)», раздел 6.8, [оператор yield »используется при определении функции генератора и используется только в теле функции генератора. Использование оператора yield в определении функции достаточно для того, чтобы это определение создало функцию генератора вместо нормальной функции.]
(Это фактически составляет основу сопутствующей архитектуры. (Ред.))
[Когда вызывается функция генератора, она возвращает итератор, известный как итератор генератора, или, более часто, генератор. Тело функции генератора выполняется путем многократного вызова метода next () генератора, пока он не вызовет исключение.
Когда выполняется оператор yield, состояние генератора блокируется, и значение expression_list возвращается вызывающей стороне next (). Под «замороженным» мы подразумеваем, что сохраняется все локальное состояние, включая текущие привязки локальных переменных, указатель инструкций и внутренний стек оценки: достаточно информации сохраняется, чтобы в следующий раз вызываться next (), Функция может работать точно так же, как если бы оператор yield был просто еще одним внешним вызовом. ]
(Также см. «PEP 0342 - сопрограммы через расширенные генераторы» для получения дополнительной информации и общей информации.)
Это должно позволить вашему графическому интерфейсу вызывать следующую часть вашего генератора спецификации алгоритма, по требованию, без необходимости переводить его в спящий режим до тех пор, пока оператор не нажмет кнопку «Далее».
Вы бы просто создали небольшой «предметно-ориентированный язык» (DSL), состоящий из списка шагов для представления этого конкретного алгоритма, а генератор (итератор) просто выполнял бы каждый следующий шаг при вызове (on спрос).
Гораздо проще и проще в обслуживании.