Невозможно создать рамку в окне Toplevel
У меня есть 1 корневое окно и окно верхнего уровня, и я хочу поместить материал в рамку в окне верхнего уровня. Тем не менее, рамка (точнее метка в ней) появляется в корневом окне.
Скриншот из окон.
from tkinter import *
root = Tk()
Label(root, text="label1").pack()
newWindow = Toplevel(root)
Label(newWindow, text="label2").pack()
frame2 = Frame(newWindow).pack()
Label(frame2, text="framelabel2").pack()
root.mainloop()
2 ответа
Вам нужно упаковать 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()
на новой строке, когда дело доходит до определения кадров или любого контейнера в этом отношении.
Вам не нужны два кадра в этом случае, просто используйте grid
выровнять метки: column
, row
формат также облегчает чтение, и у вас также есть другие варианты, такие как padx
, pady
, sticky
для большей гибкости дизайна.
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root)
frame.grid()
root.title("Tkinter Window") # Replace with anything else you want
label1 = tk.Label(root, text="Label1").grid(column=0,row=0)
label2= tk.Label(root,text="Label2").grid(column=0,row=1)
root.mainloop()
Вы можете узнать больше о grid
здесь