Содержание
Краткая памятка по скрытию окна Tkinter
- Используйте метод withdraw() для полного скрытия окна.
- Применяйте iconify() для сворачивания окна в панель задач.
- Вызывайте deiconify() для восстановления скрытого окна.
- Проверяйте состояние окна через метод state().
- Скрывайте окно до mainloop() для запуска без отображения.
- Комбинируйте withdraw() с after() для временного скрытия.
- Управляйте видимостью дочерних окон через Toplevel.
- Привязывайте скрытие к событиям кнопок или клавиш.
- Помните, что withdraw() убирает окно из панели задач.
- Всегда работайте с окном в главном потоке Tkinter.
- Используйте атрибут ‘-alpha’ для полупрозрачности вместо скрытия.
- Тестируйте скрытие окна на разных операционных системах.
#1 Апрель 1, 2013 13:39:03
4kptНу так удаляйте их. Кто за Вас это будет делать?Дело в следующем. У меня есть следующий код.Я попеременно выполняю то ok_cancel, то text_field_edit. ok_cancel завершается нормально, но после text_field_edit остается пустое окно (в случае ()), а в случае withdraw скрипт перестает что-то делать. Где ошибка, я же делаю () в text_field_edit тоже?
def ok_cancel(message): root=Tk() # Иначе будет показываться лишнее пустое окно () if (‘Подтвердите:’,message): return True else: return False () () # Вернуть отредактированный текст def text_field_edit(title,array): root, res = Tk(), [None] def callback(): res[0] = (1.0,END); () (title) scrollbar = Scrollbar(root,jump=0) txt = Text(root,font=»14″,wrap=WORD,yscrollcommand=) (END,array) # Позволяет использовать мышь для управления скроллбаром (command=) (side=RIGHT,fill=Y) () # Выход по клику кнопки ok = Button(root, text=’Запомнить и выйти’,command=callback) () # Выход по нажатию Enter и Пробел на кнопке (навигация по Shift+Tab) (‘<Return>’, lambda e:callback()) txt.focus_set() () if str(res[0])==’None’ or str(res[0])==default_line_break: my_error(empty_field_error_msg) return res[0]
Скрыть окно Tkinter
Использую messagebox, который, помимо диалога, создает пустое окно root. Для скрытия этого окна на форумах предлагается использовать (), но после этого я не всегда могу снова использовать окна Tkinter, потому что он ждет, пока я закрою скрытое окно root. Если же не скрывать пустые окна, они плодятся. Могу ли я как-нибудь по-другому избавиться от этого окна или полностью закрыть все окна Tkinter перед его повторным использованием?
#2 Апрель 1, 2013 20:38:55
Подумайте об архитектуре вашего приложения. Нет смысла десять раз создавать обьект Tk. Разберитесь вот с этим:
# -*- coding: UTF-8 -*- from Tkinter import * import tkMessageBox as messagebox from tkFont import Font root = Tk() () yesno = («OMG», «Не нажмайте ОК!») my_frame = Frame(root) my_frame.pack() my_label = Label(my_frame, text=»Мы используем все то же главное окно!») my_label.pack() root.update_idletasks() () yesno = («OMG», «Удалить окно?») () my_frame.forget() yesno = («OMG», «Новое окно?») my_label.configure(text=»Все тоже главное окно, тот же фрейм, та же надпись.») my_frame.pack() root.update_idletasks() () yesno = («OMG», «Может всетаки новое окно?») my_frame.destroy() my_frame = Frame(root) my_frame.pack() font = Font(family=»Helvetica», size=16) text = Text(my_frame, font=font) () (END, «Все новое — хорошо забытое старое.\n») (END, «В нашем случае, это не пустые слова.») Button(my_frame, text=»Выход», command=).pack() ()
- Начало
- » GUI
- » Скрыть окно Tkinter
#3 Апрель 2, 2013 00:11:09
4kpt От: Харьков Зарегистрирован: 2010-11-03 Сообщения: 998 Репутация: 63 Профиль Отправить e-mail
P.S. Подход, построенный на удалении корневых окон изначально ущербен. Легче удалять не окна (а потом их заново создавать), а рамки в которые покуются все виджеты данного сеанса или страницы программы (как Вам будет удобно). Таким образом, корневое окно не будет мучаться, а виджеты будут скрываться. Кстати, есть еще альтернативный механизм — метод _forget() который скрывает рассположение рамки с упакованными виджетами. Если снова понадобиться, можно заново ее разместить:)P.S.S. Надеюсь это оно…
“Каким образом удалить корневое окно, вывод которого скрыт методом.withdraw()?”
Griffon Вы абсолютно правы. Вопрос поставлен неккоректно.Вопрос должен быть следующим:В результате имеет то, что окна размножаются при каждом вызове и естественно, обращение к ним блокируется.Ну так удаляйте их. Кто за Вас это будет делать? Пример кода:
#4 Апрель 2, 2013 00:59:50
4kptНеверно…Разберитесь…По Вашему коду. Поменяйте местами эти две строки:Поменял. Осталось как раньше — окна messagebox нормально убиваются, а после text_field_edit остается пустое root-окно, хотя если использовать только text_field_edit, все завершается нормально. Куда в этой функции (text_field_edit) я могу поместить mainloop? Если до кнопок — кнопки не отображаются, если последней строкой — скрипт не сможет вернуть тот текст, который пользователь вводит в окно. Вырубаю в терминалеПохоже да, какие-то проблемы именно с mainloop. Но где тогда он должен стоять? Разве где-то в другом месте?Отвечая на ваш вопрос, mainloop — метод, запускающий цикл обработки событий.
#8 Апрель 2, 2013 03:25:19
Griffon От: Ukrain, Zaporozhie Зарегистрирован: 2009-03-04 Сообщения: 324 Репутация: 11 Профиль Отправить e-mail
Возможно вы не хотите закрывать главное окно и потом заново его создавать. Возможно вы просто хотите скрывать и вновь отображать одно и то же главное окно, а что на нем отображается можно менять как вам угодно.Если же вы действительно хотите то о чем просите, то вам просто необходимо использовать метод destroy экземпляра Tk (root в вашем случае). Но мне кажется что вы ставите задачу не совсем правильно.
#9 Апрель 2, 2013 09:39:30
vanvanov Зарегистрирован: 2013-03-31 Сообщения: 252 Репутация: 4 Профиль Отправить e-mail
Часто задаваемые вопросы о скрытии окна Tkinter
Вопрос: Как скрыть окно Tkinter без завершения программы?
Ответ: Используйте метод withdraw() для скрытия окна, при этом программа продолжит работать в фоне.
Вопрос: Как снова показать скрытое окно Tkinter?
Ответ: Вызовите метод deiconify() для восстановления отображения окна.
Вопрос: В чем разница между withdraw() и iconify()?
Ответ: withdraw() полностью скрывает окно, а iconify() сворачивает его в панель задач.
Вопрос: Можно ли скрыть окно Tkinter при запуске программы?
Ответ: Да, вызовите withdraw() сразу после создания окна, до запуска главного цикла mainloop().
Вопрос: Как проверить, скрыто ли окно Tkinter в данный момент?
Ответ: Используйте метод state(), который вернет ‘withdrawn’ для скрытого окна.
Вопрос: Скрывает ли метод withdraw() окно из панели задач?
Ответ: Да, withdraw() полностью убирает окно из панели задач и рабочего стола.
Вопрос: Как временно скрыть окно Tkinter на несколько секунд?
Ответ: Используйте withdraw() в комбинации с after() для автоматического показа через заданный интервал.
Вопрос: Можно ли скрыть только дочернее окно Tkinter?
Ответ: Да, примените метод withdraw() к конкретному экземпляру Toplevel.
Вопрос: Как скрыть окно Tkinter при нажатии кнопки?
Ответ: Привяжите команду с вызовом withdraw() к событию нажатия кнопки через параметр command.
Вопрос: Безопасно ли скрывать окно Tkinter в многопоточном приложении?
Ответ: Да, но все операции с окном должны выполняться в главном потоке Tkinter.























