2009-04-08 4 views
3

Я просто хочу получить эквивалент закрытия и повторного открытия моей основной программы. Я хочу вызвать его, когда нажимают на «новый» вариант из раскрывающегося меню. Что-то вроде вызова root.destroy(), а затем повторного запуска mainloop.Сброс главного окна графического интерфейса пользователя

Как это сделать?

ответ

1

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

2

Если вы находитесь в Unix, перезапустите все приложение с помощью os.execv. Убедитесь, что вы передали все аргументы командной строки и т. Д.

+0

+1: Умный; на самом деле перезапустить вместо эквивалента перезапуска. –

3

Существует по крайней мере три способа решения этой проблемы.

Способ первый: подделка головы. Когда вы создаете приложение, не помещайте все виджеты в корневое окно. Вместо этого скройте корневое окно и создайте новый верхний слой, который представляет ваше приложение. Когда вы перезагружаете, это просто вопрос уничтожения этого нового уровня и повторного запуска всей вашей логики запуска.

Метод второй: nuke и pave. Похож на концепцию, но немного отличается в исполнении. В этой модели, когда вы хотите перезагрузить, вы просто удалите все виджеты в главном окне, сбросьте геометрию до нуля (чтобы окно снова изменило размер на основе его содержимого), а затем запустите логику, которая рисует все остальные виджеты ,

Метод три: если он сработал в первый раз ... Как предложил Мартин против Льюис, просто попросите свою программу выполнить новый экземпляр программы, а затем выйдите.

Первые два метода потенциально быстрее и имеют преимущество (dis?) Сохранения текущей среды. Например, вы можете сохранить копию буфера обмена, ширины столбцов и т. Д. Третий метод абсолютно гарантирует чистый сланец.

Смежные вопросы