Вам необходимо упаковать frame2
в новую строку, например, так:
from tkinter import *
root = Tk()
Label(root, text="label1").pack()
newWindow = Toplevel(root)
Label(newWindow, text="label2").pack()
frame2 = Frame(newWindow)
frame2.pack() # pack frame2 on new line here.
Label(frame2, text="framelabel2").pack()
root.mainloop()
Причина, по которой ваша метка framelabel2
помещается в корневое окно, связана с тем, что frame2
означает == дляNone
как pack()
возвращает None
.Поскольку вы пытаетесь упаковать виджет в None
, tkinter по умолчанию переводит этот виджет в корневое окно, пытаясь разместить этот виджет где-нибудь.
Простое исправление - убедиться, что вы всегда делаете pack()
, grid()
или place()
в новой строке, когда речь идет об определении фреймов или любого контейнера в этом отношении.