Jak mam odradzać okna dla dzieci Toplevel()
w tkinter, które nie zamykają się, gdy rodzic się zamknie?Stwórz okno z tekselami, które nie zamyka się z rodzicem.
Czy muszę mieć, aby rodzic zachowywał "liczbę referencyjną" okien potomnych, przechwytywać WM_DELETE_WINDOW
i dzwonić pod numer root.destroy()
, gdy wszystkie dzieci zniknęły?
Czy jest to dopuszczalna praktyka, aby spawnować inny proces
wątku
z własnym kodem mainloop
?
A może jest bardziej elegancki sposób?
EDIT
Jestem obecnie robi rzeczy w ten sposób
root = Tk()
app = App(root) # doesn't call Toplevel()
root.mainloop()
gdzie App.__init__()
dodaje widgety do root
bez wywoływania Toplevel()
, iw pewnym momencie ikra nowe okno z tej funkcji:
def new_window():
root = Tk()
window = App2(root) # doesn't call Toplevel() either
Zauważ, że root
w new_window()
to inna zmienna niż oryginalna root
, uzyskana przez inne połączenie z Tk()
.
Wszystko to wydaje się robić właściwe rzeczy, tj. Okno potomne żyje niezależnie od rodzica, a proces python umiera po zamknięciu obu.
Moje pytanie brzmi, czy to ma sens, czy też robię coś okropnego tutaj?
Teraz uzyskuję nowy katalog główny z 'tk.Tk()' ale nie ponownie wywołuję 'mainloop()' - to wydaje się działać, chociaż jest znacznie prostsze - jakikolwiek pomysł, dlaczego tak się stało? Można by pomyśleć, że 'Tk()' będzie singletonem zwracającym tego samego mistrza, ale tworzenie widgetów na nim nie wydaje się wpływać na pierwsze okno. –
Przy okazji zobaczę moją edycję na oryginalne pytanie - chodzi mi o proces, a nie wątek. –
Nie jestem pewien, czy rozumiem twoje pytanie. Jest o wiele prostszy sposób niż to, co pokazałem powyżej - wystarczy użyć Toplevels i wywołać 'root.withdraw()' - ale wtedy możesz zamknąć wszystkie swoje Toplevels i program będzie nadal działał w tle. W ten sposób zbierzesz procesy zombie. Celem powyższego rigmarole jest spowodowanie, że program zakończy się po zamknięciu ostatniego Toplevel. Jeśli nie odpowiem na twoje pytanie, opublikuj swój kod. – unutbu