#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")