У меня есть создатель отчетов 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 на Win10 с использованием 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__):'" test.
Добавлено 20181129: только что обнаружен метод универсального виджета waitvariable (см. http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.html). Основная идея состоит в том, чтозапустить код создания отчета как поток do-forever (демон?), управляемый этим методом (с выполнением, управляемым кнопкой «Делать отчеты» в графическом интерфейсе).
Из веб-исследований, которые я знаючто все действия tkinter должны выполняться из основного (родительского) потока,Это означает, что я должен переместить окно «Готово» в этот поток.
Мне также нужно, чтобы это окно отображало некоторые данные (три строки), которые он получает из «дочернего» потока.Я подумываю об использовании глобалов уровня приложения в качестве семафоров (записываемых только потоком создания отчета и считываемых только основной программой) для передачи данных.Я знаю, что это может быть рискованно с более чем двумя потоками, но делать что-то большее (например, с использованием очередей?) Для моей простой ситуации кажется излишним.
Подводя итог: Какой самый простой способ разрешить пользователю манипулировать (перемещать, изменять размер, минимизировать и т. Д.) Главным окном приложения, пока оно по какой-либо причине заморожено.Другими словами, O / S, а не tkinter, должен управлять фреймом (снаружи) главного окна.
Ответ должен работать на Python 3.2.2+ кросс-платформенным способом (по крайней мере, на Windows &Linux)