Tcl/Tk - как заставить окно исчезать при нажатии кнопки ОК, когда ОК запускает симуляцию
У меня есть простое окно в Tcl/Tk, которое при нажатии кнопки ОК запускает симуляцию. Я использую Linux. Окно разрушается, когда симуляция заканчивается. Проблема в том, что окно остается включенным во время симуляции. Я хочу, чтобы окно исчезло после нажатия кнопки ОК.
Я пытался с помощью wm withdraw .mywindow
но он делает область, в которой было отображено окно (содержащее кнопку ОК), белой.
я нашел update
пока гуглит, но говорят, что это вредно.
1 ответ
Если вы делаете wm withdraw .mywindow
окно на самом деле не исчезнет, пока не будет введен цикл обработки событий, потому что именно цикл обработки событий выполняет перерисовку экрана.
У вас есть несколько вариантов решения вашей проблемы. Например, вы можете позвонить на обновление idletasks. Это вариация на update
это просто обрабатывает "простаивающие" задачи, такие как рисование экрана, но не задачи, такие как реагирование на кнопки и другие пользовательские события. Итак, первое решение:
wm withdraw .mywindow
update idletasks
run_simulation
Кстати, причина update
вредно потому, что по сути запускает новый цикл обработки событий - еще один бесконечный цикл. Если во время этого цикла событий происходит событие, которое вызывает повторный запуск того же кода, вы запускаете третий, четвертый и т. Д. Как правило, вложенные бесконечные циклы никогда не бывают полезными. Помните: tcl является однопоточным, поэтому циклы событий не работают параллельно.
Другое решение состоит в том, чтобы естественным образом войти в цикл обработки событий и запланировать выполнение симуляции после обработки всех других событий. Сделайте это, запустите симуляцию с помощью команды после. С помощью after
поместит событие в очередь событий. Когда цикл событий дойдет до этого события, начнется ваше моделирование.
Например:
wm withdraw .mywindow
after idle run_simulation
Когда вышеприведенный код завершается - при условии, что он был вызван в результате такого события, как нажатие кнопки или клавиши, - цикл события будет повторно введен, все ожидающие события будут обработаны, а затем ваш run_simulation
Команда будет работать.
Кстати, если у вас есть графический интерфейс, который должен реагировать во время выполнения симуляции, вы должны прочитать " Сохранить графический интерфейс живым" во время длинных вычислений в вики tcler. Там есть что почитать, что делает проблему более сложной, чем на самом деле, но это не так сложно, как может показаться на первый взгляд.