Как перейти к следующему окну в tkinter

#python #tkinter

Вопрос:

Я прошу прощения за расплывчатую формулировку в этом вопросе. Я создал систему входа в систему с помощью Tkinter, но не уверен, как создать новое окно для главного меню приложения, которое я хочу создать. Я попытался открыть новое окно, но оно по-прежнему оставляет окно входа открытым, и если я попытаюсь удалить его с помощью команды .destroy, оно отключит все это. есть ли способ полностью обновить/открыть новое окно?

Комментарии:

1. Используйте Toplevel и root.withdraw() тем временем, чтобы скрыть окно.

2. Эй, спасибо, что ответили.

3. Или создайте новый tk.Tk и вызовите old_root.destroy() старый, который вы не собираетесь использовать. Если вы позвоните old_root.destroy() первым, он переключит окно tkinter по умолчанию, так что у вас не должно возникнуть никаких проблем с использованием нового окна.

Ответ №1:

есть ли способ полностью обновить/открыть новое окно?

Самое простое решение-поместить все ваши «окна» в рамки-все окно входа находится внутри одного кадра, главное окно находится внутри одного кадра и т. Д.

Затем, когда вы будете готовы переключиться с одного на другое, просто уничтожьте рамку входа в систему и создайте рамку главного окна, и все это без необходимости уничтожать главное окно.

Аналогичное решение состоит в том, чтобы просто удалить все дочерние элементы в корневом окне, а затем добавить новые виджеты. Проще всего, если все находится в одном кадре, но вы можете уничтожить все виджеты один за другим, вызвав winfo_children корневое окно и повторив результаты.

Комментарии:

1. Иногда это не очень хорошая идея, особенно когда вы хотите привязать корень к нажатию клавиши (например "<Return>" ).

2. @TheLizzard: да, в каждом дизайнерском решении есть компромиссы.

3. Если вы уничтожите старое окно, это будет похоже на то, как если бы вы только что импортировали tkinter в первый раз. Поэтому вы можете просто создать новое окно. Я нахожу, что это самый интуитивный способ. Кроме того, у него не будет никаких побочных эффектов от того, что я тестировал.

4. @TheLizzard: «Если вы уничтожите старое окно, это будет похоже на то, как если бы вы только что импортировали tkinter в первый раз. » … это не на 100% правда. Глобальные переменные, которые, возможно, были созданы ранее, все еще будут существовать.

5. @TheLizzard: да, переменные tkinter будут сброшены, но не другие переменные. Вы подразумевали, что все данные сброшены, и это неправда.

Ответ №2:

Вы можете позвонить old_root.destroy() , и это закроет старое окно. Он также сбросит все глобальные переменные в tkinter, так что все будет так, как если бы вы только что импортировали tkinter в первый раз. Таким образом, вы можете создать новое окно tkinter с помощью tk.Tk() . Я нахожу этот подход более интуитивным и простым для понимания/реализации.

Редактировать: Вам нужно сначала извлечь данные из ваших записей/других виджетов, прежде чем звонить old_root.destroy() , в противном случае данные также будут удалены.

Комментарии:

1. Обычно вы создаете уровни своего приложения и, возможно, захотите использовать данные для входа в систему в своем дальнейшем приложении. Я не могу разделить вашу точку зрения

2. @Atlas435 вот почему вы сначала извлекаете данные из записей, а затем уничтожаете окно. Если у вас есть данные в переменных python, это не будет вызвано уничтожением окна. Я отредактирую свой ответ, чтобы сделать это более понятным. Кроме того, все привязки для старого окна будут называться больше.

3. Спасибо, что указали на это. Но все же я сомневаюсь, что это правильный выбор. Просто представьте себе огромное приложение, и вы просто хотите выйти из системы и войти в систему с другим пользователем. Вам нужно будет уничтожить свое приложение и перезагрузить его полностью, просто для смены пользователя,

4. @Atlas435 в противном случае все привязки по-прежнему будут там. Представьте, что OP решил привязаться "<Return>" , чтобы пользователю не нужно было нажимать кнопку входа в систему. Если он использует old_root.bind("<Return>", login_function) и пользователь нажимает "<Return>" после того, как он уже вошел в систему, то его программа выйдет из строя (если он использует метод Брайаноукли). Кроме того, перезагрузка экрана не должна занимать так много времени в хорошо разработанной программе. Кроме того, большинство программ имеют только 1 или 2 экрана, и пользователь переключается между ними.

5. @Atlas435 также old_root.after скрипты будут отменены, если вы используете old_root.destroy() . Кроме того, время создания нового окна 0.170 на моем компьютере составляет секунды. Эта задержка даже не заметна.