我需要我的界面看起来像这样:
每种颜色都是一个单独的框架,在每个框架中我定义了一些标签。
from tkinter import *
root = Tk()
root.title("Library program")
root.geometry('{}x{}'.format(900, 450))
root.resizable(width=False, height=False)
#define main containers
topFrame = Frame(root, width=450, height=50, pady=3)
bottomFrame = Frame(root, width=450, height=50)
#main container layouts
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(0, weight=1)
topFrame.grid(row=0, sticky="nsew")
bottomFrame.grid(row=1, sticky="nsew")
#define additional containers
bottomFrame.grid_rowconfigure(0, weight=1)
bottomFrame.grid_columnconfigure(1, weight=1)
bottomLeft = Frame(bottomFrame, width=225, bg="red")
bottomMidLeft = Frame(bottomFrame, width=225, bg="blue")
bottomMidRight = Frame(bottomFrame, width=225, bg="yellow")
bottomRight = Frame(bottomFrame, width=225, bg="green")
bottomLeft.pack_propagate(0)
bottomMidLeft.pack_propagate(0)
bottomMidRight.pack_propagate(0)
bottomRight.pack_propagate(0)
bottomLeft.grid(row=0, column=0, sticky = "nsew")
bottomMidLeft.grid(row=0, column=1, sticky = "nsew")
bottomMidRight.grid(row=0, column=2, sticky = "nsew")
bottomRight.grid(row=0, column=3, sticky = "nsew")
#top container widgets
titleLabel = Label(topFrame, text="Jakub's Library Program", font="Calibri 20")
titleLabel.pack()
#bottom container widgets
leftLabel = Label(bottomLeft, text="Book Search", font="Calibri")
midLeftLabel = Label(bottomMidLeft, text="Book Checkout", font="Calibri")
midRightLabel = Label(bottomMidRight, text="Return Books", font="Calibri")
rightLabel = Label(bottomRight, text="Popular Books", font="Calibri")
leftLabel.grid(row=0, column=0)
midLeftLabel.pack()
midRightLabel.pack()
rightLabel.pack()
bookTitleLabel = Label(bottomLeft, text="Book title", font="Calibri 12")
bookTitleEntry = Entry(bottomLeft)
bookTitleLabel.grid(row=1, column=0)
bookTitleEntry.grid(row=1, column=1)
root.mainloop()
但是由于我需要将标签和条目放置在红色框中,因此我使用grid()而不是pack()将标签放置在每个框中。
leftLabel.grid(row=0, column=0)
midLeftLabel.grid(row=0, column=0)
midRightLabel.grid(row=0, column=0)
rightLabel.grid(row=0, column=0)
使用grid()显示左下标签没有问题,但是使用网格显示其余标签后,由于某种原因它会抛弃帧的大小。
答案 0 :(得分:1)
如果您的目标是创建四个相等大小的列,则shared_ptr
使其非常容易。您需要确保每列具有相同的非零权重,并且需要为每列赋予grid
选项相同的值。
您还应该删除对uniform
的呼叫。关闭几何图形传播很少是正确的选择。如果您需要做一堆数学运算来确保所有内容都适合,这是一个不错的解决方案,但是让tkinter进行所有工作以使所有内容都适合将更加容易。
删除此阻止:
pack_propagate
添加这一行代码:
bottomLeft.pack_propagate(0)
bottomMidLeft.pack_propagate(0)
bottomMidRight.pack_propagate(0)
bottomRight.pack_propagate(0)
注意:这将导致您的输入窗口小部件被裁剪。那是因为您是a)强制将窗口设置为特定大小,b)将该大小分为四个相等的列,c)使用输入小部件的默认大小,该大小太大而无法满足您的其他设计选择。
更好的方法是不将窗口强制为特定大小。而是让内容确定窗口的大小。您可以专注于内部小部件的最佳尺寸,然后让tkinter来完成确定窗口需要多大的工作。
在任何一种情况下(是否使用强制窗口大小),都不需要给框架指定宽度,因为bottomFrame.grid_columnconfigure((0,1,2,3), uniform="equal", weight=1)
会调整它们的大小以适合它们。
我还建议删除grid
。删除用户调整窗口大小的功能是非常用户友好的操作。