Wie soll ich Kind Toplevel()
Windows in tkinter spawn, die nicht schließen, wenn das Elternteil schließt?Machen Sie tkinter Toplevel-Fenster, das nicht mit dem Elternteil schließt
Muss ich die Eltern behalten eine 'Referenz Anzahl' von Kind Windows, abfangen WM_DELETE_WINDOW
und nur anrufen root.destroy()
, wenn alle Kinder weg sind?
Oder ist es akzeptable Praxis, einen anderen
Thread
Prozess mit einem eigenen tk mainloop
zu spawnen?
Oder gibt es einen eleganteren Weg?
EDIT
Ich bin derzeit die Dinge auf diese Weise
root = Tk()
app = App(root) # doesn't call Toplevel()
root.mainloop()
tun, wo App.__init__()
Widgets root
fügt ohne Toplevel()
Aufruf, und irgendwann laicht ein neues Fenster mit dieser Funktion:
def new_window():
root = Tk()
window = App2(root) # doesn't call Toplevel() either
Beachten Sie, dass root
in new_window()
ist eine andere Variable als die ursprüngliche root
, erhalten durch einen anderen Anruf an Tk()
.
All dies scheint zu tun Das richtige Ding, d. H. Das Kindfenster lebt unabhängig von dem Elternteil und der Pythonprozess stirbt, nachdem beide geschlossen sind.
Also meine Frage wird, macht das Sinn oder mache ich hier etwas schrecklich falsch?
Ich erhalte jetzt eine neue Wurzel mit 'tk.Tk()', aber rufe 'hoistloop()' nicht wieder auf - das scheint zu funktionieren, während es viel einfacher ist - irgendeine Idee, warum das sein könnte? Sie würden denken, 'Tk()' wäre ein Singleton, der denselben Master zurückgibt, aber das Erstellen von Widgets scheint das erste Fenster nicht zu beeinflussen. –
Btw siehe meine Bearbeitung der ursprünglichen Frage - ich meinte Prozess nicht thread. –
Ich bin mir nicht ganz sicher, ob ich deine Frage verstehe. Es gibt einen viel einfacheren Weg als das, was ich oben zeige - benutze einfach Toplevels und rufe 'root.withdraw()' auf - aber dann kannst du alle deine Toplevels schließen und das Programm läuft immer noch im Hintergrund. Sie werden auf diese Weise Zombie-Prozesse ansammeln. Der Zweck des oben genannten Fehlers ist es, das Programm zu beenden, wenn der letzte Toplevel geschlossen wird. Wenn ich deine Frage nicht beantworte, poste bitte deinen Code. – unutbu