Как узнать имя окна верхнего уровня другого верхнего уровня?

#python #tkinter #toplevel

Вопрос:

 import tkinter as tk   r = tk.Tk() r.title("root") r.geometry("200x200") f =tk.Frame(r) f.pack()  top1 = tk.Toplevel(f) top1.title("A") #some widgets inside top2  top2 = tk.Toplevel(top1) top2.title("B")   print(top1.winfo_toplevel(), top1.winfo_children())  r.mainloop()  

Я хочу только получить top1 высший уровень и ничего больше, то есть .!frame.!toplevel.!toplevel

winfo_toplevel() ВОЗВРАТ .!frame.!toplevel

winfo_children() возвращается .!frame.!toplevel.!toplevel , … все дети

Комментарии:

1. ну top1.winfo_children()[0] и что ?

2. Вы не можете получить .!frame.!toplevel.!toplevel независимо от того, как, потому top1 что есть Toplevel , а его родитель — Frame нет Toplevel . Вы можете получить корневое окно ( . ) с помощью top1.master.winfo_toplevel() .

3. @HenryYik, но это не обязательно будет с индексом 0, до и после него может быть виджет.

4. @acw1668 top1.master.winfo_toplevel() почему это дает корень и почему top1.winfo_toplevel() дает .!frame.!toplevel , я в замешательстве

5. widget.winfo_toplevel() вернет себя , если widget есть Toplevel , в противном случае вернет Toplevel содержимое widget . Так top1.winfo_toplevel() вернется само, то .!frame.!toplevel есть . top1.master есть f , так top1.master.winfo_toplevel() что это то же самое, f.winfo_toplevel() что возвращает корневое окно.

Ответ №1:

Ваш вопрос немного неясен, но я думаю, что вы спрашиваете top2 , как получить только top1 то, что дано .

Прямого способа сделать это нет. Вы можете получить всех детей top1 , а затем вернуть всех детей, которые являются Toplevel виджетами. Если вы знаете , что top1 у этого есть только один ребенок, который является a Toplevel , вы можете вернуть первого ребенка, который является a Toplevel .

 def get_toplevel(w):  for child in w.winfo_children():  if child.winfo_class() == "Toplevel":  return child  raise Exception("No toplevel window was found")