Полезная информация, особенно для запуска фоновой функции в приложении tkinter.

я есть создатель отчетов Python 3.x, который так привязан к вводу / выводу (из-за SQL, а не python), что главное окно будет «заблокировано» дляминут в то время как отчеты создаются.

Все, что нужно, - это возможность использовать стандартные действия окна (перемещение, изменение размера / минимизации, закрытие и т. Д.), Пока графический интерфейс пользователя заблокирован (все остальное в графическом интерфейсе может оставаться «замороженным» до завершения всех отчетов).

Добавлено 20181129: Другими словами, tkinter должен контролировать только СОДЕРЖАНИЕ окна приложения и оставлять обработку всех стандартных (внешних) оконных элементов управления для O / S. Если я могу это сделать, моя проблема исчезает, и мне не нужно использовать все потоки / подпроцессы (замораживание становится приемлемым поведением, аналогичным отключению кнопки «Делать отчеты»).

Какой самый простой / простой способ (=минимальный это мешает существующему коду) - в идеале таким образом, чтобы он работал с Python> = 3.2.2, и кросс-платформенным способом (то есть работает по крайней мере в Windows и Linux).

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

Что нужно учитывать:

Пользователи выбирают свои отчеты, а затем нажимают кнопку «Создать отчеты» в главном окне (когда начинается реальная работа и происходит остановка). После того, как все отчеты завершены, код создания отчета отображает (Toplevel) окно «Готово». Закрытие этого окна включает все в главном окне, позволяя пользователямвыйти из программы или создать больше отчетов.

Добавлено 20181129: через, по-видимому, случайные интервалы (с интервалом в несколько секунд) я могу перемещать окно.

За исключением отображения окна «Готово», код создания отчета никак не связан с GUI или tkinter.

Некоторые данные, полученные с помощью кода создания отчета, должны появиться в окне «Готово».

Нет смысла «распараллеливать» создание отчетов, тем более что один и тот же сервер SQL и база данных используются для создания всех отчетов.

В случае, если это повлияет на решение: в конечном итоге мне нужно будет отображать имена отчетов (теперь отображаются на консоли) в графическом интерфейсе при создании каждого отчета.

Впервые я выполняю потоки / подпроцессирование с python, но знаком с обоими языками.

Добавлено 20181129: Среда разработки - 64-битный Python 3.6.4 на Win 10 с использованием Eclipse Oxygen (плагин pydev). Приложение должно быть переносимым как минимум на Linux.

Самый простой ответ - использовать потоки. Необходим только один дополнительный поток (тот, который создает отчеты). Линия поражения:

DoChosenReports()  # creates all reports (and the "Done" window)

при изменении на:

from threading import Thread

CreateReportsThread = Thread( target = DoChosenReports )
CreateReportsThread.start()
CreateReportsThread.join()  # 20181130: line omitted in original post, comment out to unfreeze GUI 

успешно создает отчеты с отображением их имен на консоли по мере их создания.
Однако графический интерфейс пользователя остается замороженным, и окно «Готово» (теперь вызывается новым потоком) никогда не появляется. Это оставляет пользователя в подвешенном состоянии,не в состоянии что-либо сделать и интересно, что, если что-нибудь, произошло (вот почему я хочу отображать имена файлов в графическом интерфейсе по мере их создания).

Кстати, после того, как отчеты сделаны, поток создания отчетов должен незаметно совершить самоубийство до (или после) отображения окна «Готово».

Я также пытался использовать

from multiprocessing import Process

ReportCreationProcess = Process( target = DoChosenReports )
ReportCreationProcess.start()

но это не соответствует основным программам теста "if (__name__ == '__main__):'".

Добавлено 20181129: только что обнаружен метод универсального виджета waitvariable (см.http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.html). Основная идея состоит в том, чтобы запустить код создания отчета как поток do-forever (daemon?), Управляемый этим методом (с выполнением, контролируемым кнопкой «Do reports» в GUI).

Из веб-исследований я знаю, что все действия tkinter должны выполняться из основного (родительского) потока, что означает, что я должен переместить окно «Готово» в этот поток.
Мне также нужно, чтобы это окно отображало некоторые данные (три строки), которые он получает из дочернего потока. Я подумываю об использовании глобалов уровня приложения в качестве семафоров (записываемых только потоком создания отчета и считываемых только основной программой) для передачи данных. Я знаю, что это может быть рискованно с более чем двумя потоками, но делать что-то большее (например, используя очереди?) Для моей простой ситуации кажется излишним.

Обобщить: Какой самый простой способ разрешить пользователю манипулировать (перемещать, изменять размер, минимизировать и т. Д.) Главным окном приложения, пока оно по какой-либо причине заморожено. Другими словами, O / S, а не tkinter, должен управлять рамкой (снаружи) главного окна.
Ответ должен работать на Python 3.2.2+ кросс-платформенным способом (по крайней мере, для Windows и Linux)