从pack()切换到grid()方法时的Tkinter重缩放帧大小

时间:2019-12-02 21:58:50

标签: python-3.x tkinter

我需要我的界面看起来像这样:

Desired outcome

每种颜色都是一个单独的框架,在每个框架中我定义了一些标签。

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)

现在我的界面如下所示: Not good

使用grid()显示左下标签没有问题,但是使用网格显示其余标签后,由于某种原因它会抛弃帧的大小。

1 个答案:

答案 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。删除用户调整窗口大小的功能是非常用户友好的操作。