#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
на моем компьютере составляет секунды. Эта задержка даже не заметна.