无法在“顶级”窗口中创建框架

时间:2018-12-04 13:25:14

标签: python python-3.x tkinter frame toplevel

我有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 :(得分:4)

您需要将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返回Nonepack() = None。因为您尝试将小部件打包到None,所以tkinter会将其默认设置为根窗口,以尝试将该小部件放置在某处。

简单的解决方法是,在定义框架或任何与此相关的容器时,确保始终在新行上执行pack()grid()place()

答案 1 :(得分:-1)

在这种情况下,您不需要两个框架,只需使用grid来对齐标签: columnrow格式还使其更易于阅读,并且您还具有其他选项,例如padxpadysticky,以提高设计的灵活性。

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 here的更多信息。