Невозможно создать рамку в окне Toplevel - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть 1 корневое окно и окно верхнего уровня, и я хочу поместить материал в рамку в окне верхнего уровня.Тем не менее, рамка (точнее метка в ней) появляется в корневом окне.

Снимок экрана из окон.

Screen Shot

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 ]

0 голосов
/ 04 декабря 2018

В этом случае вам не нужны два кадра, просто используйте 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 можно узнать здесь .

0 голосов
/ 04 декабря 2018

Вам необходимо упаковать 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() в новой строке, когда речь идет об определении фреймов или любого контейнера в этом отношении.

...