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. Там есть что почитать, что делает проблему более сложной, чем на самом деле, но это не так сложно, как может показаться на первый взгляд.

Другие вопросы по тегам