Невозможно создать рамку в окне 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 здесь

Другие вопросы по тегам