Как я должен порождать дочерние объекты Toplevel()
окна в tkinter, которые не закрываются при закрытии родителя?Сделать окно tkinter toplevel, которое не закрывается с родителем
Должен ли я иметь родительскую учетную запись «дочерних окон», перехватывать WM_DELETE_WINDOW
и звонить только root.destroy()
, когда все дети ушли?
Или это приемлемая практика, чтобы порождать другую
нить
процесс со своим собственным tk mainloop
?
Или есть более элегантный способ?
EDIT
Я сейчас делаю вещи таким образом
root = Tk()
app = App(root) # doesn't call Toplevel()
root.mainloop()
где App.__init__()
добавляет виджеты к root
без вызова Toplevel()
, и в какой-то момент порождает новое окно с помощью этой функции:
def new_window():
root = Tk()
window = App2(root) # doesn't call Toplevel() either
Отметьте, что root
в new_window()
- это другая переменная к исходному root
, полученная другим звонком до Tk()
.
Все это, кажется, делает правильную вещь, то есть дочернее окно живет независимо от родителя, и процесс python умирает после того, как оба они закрыты.
Так что мой вопрос становится, это имеет смысл или я делаю что-то ужасно неправильно здесь?
Теперь я получаю новый корень с помощью 'tk.Tk()', но не вызываю 'mainloop()' снова - это, кажется, работает, будучи намного проще - любая идея, почему это может быть? Вы думаете, что 'Tk()' будет singleton, возвращая тот же самый мастер, но создание виджета на нем, похоже, не влияет на первое окно. –
Btw см. Мое редактирование на исходный вопрос - я имел в виду процесс не поток. –
Я не совсем уверен, что понимаю ваш вопрос. Существует гораздо более простой способ, чем то, что я показываю выше - просто используйте Toplevels и назовите 'root.withdraw()' - но тогда вы можете закрыть все свои Toplevels, и программа все равно будет работать в фоновом режиме. Таким образом, вы будете накапливать процессы зомби. Цель вышеперечисленного rigmarole заключается в том, что программа заканчивается, когда последний Toplevel закрыт. Если я не отвечу на ваш вопрос, отправьте свой код. – unutbu