有关在网格中的Tkinter中对齐框架的问题,尝试使用框架中的.grid()和.pack()获得相同的结果

时间:2018-11-21 21:10:29

标签: python python-3.x macos tkinter

python的新手,并从此网站获得了很多有用的信息。

我正在使用.grid()创建图表,然后再次使用.pack()中的框架作为练习,以查看是否可以获得相同的结果。

函数showchart_grid()可以工作并产生几乎我想要创建的东西。它是一张图表,其中下一行是14个正方形,上一行是这些正方形的标签,有时列标签跨越2个正方形。您可以在columnpan =属性中看到这一点。在第0行的列标签之间有一些奇怪的空格,但是除了它们全部对齐之外。

def showchart_grid():
    root = Tk()

    # create 14 squares on the grid

    for i in range(1, 15):

        spot = Label(root, text='square', bg='white', height=5, width=10, borderwidth=1, relief='solid', justify=CENTER)
        spot.grid(row=1, column=i)

    # create the column labels on top of the grid in row one

    label0 = Label(root, text=0, bg="DodgerBlue", fg="white", height=2, width=10, borderwidth=1, relief='solid')
    label0.grid(row=0, column=1)
    label1 = Label(root, text=1, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label1.grid(row=0, column=2, columnspan=2)
    label2 = Label(root, text=2, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label2.grid(row=0, column=4, columnspan=2)
    label4 = Label(root, text=4, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label4.grid(row=0, column=6, columnspan=2)
    label6 = Label(root, text=6, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label6.grid(row=0, column=8, columnspan=2)
    label8 = Label(root, text=8, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label8.grid(row=0, column=10, columnspan=2)
    label11 = Label(root, text=11, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label11.grid(row=0, column=12, columnspan=2)
    label15 = Label(root, text=15, bg="CadetBlue1", height=2, width=10, borderwidth=1, relief='solid')
    label15.grid(row=0, column=14)

    mainloop()

现在,当我尝试通过为列标签创建框架和为正方形创建框架来做相同的事情时,即使大小相同,位置也不再匹配。好像列标签没有填满整个框架。我已经把fill =和expand =弄乱了,但是还无法弄清楚具体如何。注意:此版本解决了列标签之间的怪异空白问题。

def showchart_framespack_test():
    root = Tk()

    # define my frames

    pointsframe = Frame(root, width=140)
    pointsframe.pack(side=TOP)

    playerframe = Frame(root, width=140)
    playerframe.pack(side=TOP)

    # create bottom row of squares with pack

    for i in range(1, 15):

        spot = Label(playerframe, text='empty', bg='white', height=5, width=10, borderwidth=1, relief='solid', justify=CENTER)
        spot.pack(side=LEFT)

    # create top row of labels with pack

    label0 = Label(pointsframe, text=0, bg="DodgerBlue", fg="white", height=2, width=10, borderwidth=1, relief='solid')
    label0.pack(side=LEFT)
    label1 = Label(pointsframe, text=1, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label1.pack(side=LEFT)
    label2 = Label(pointsframe, text=2, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label2.pack(side=LEFT)
    label4 = Label(pointsframe, text=4, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label4.pack(side=LEFT)
    label6 = Label(pointsframe, text=6, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label6.pack(side=LEFT)
    label8 = Label(pointsframe, text=8, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label8.pack(side=LEFT)
    label11 = Label(pointsframe, text=11, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label11.pack(side=LEFT)
    label15 = Label(pointsframe, text=15, bg="CadetBlue1", height=2, width=10, borderwidth=1, relief='solid')
    label15.pack(side=LEFT)



mainloop()

如何改善此处的编程以获得所需的底部14个正方形的结果,顶部的标签与每个底部的14个正方形的边界完美对齐?

PS是函数,因为它们将接受输入并按原样调整图表,但到目前为止,我一直将其保留为“空”。

1 个答案:

答案 0 :(得分:2)

从根本上说,网格是二维布局。如果将两个项目分配到同一列,则它们垂直排列。

另一方面,pack是一维布局,可将元素相对于其他元素定位。

在第二个示例中,您将创建两个相互独立的元素的水平列表。两者的项目数相同,但是元素不会对齐,因为两个帧的“列”是分别计算的。

如果您可以在没有单元格跨越多个列的情况下生存,则可以通过创建15个包含标签和正方形的框架并使用pack将它们并排放置来使列对齐。

除此之外,您的用例确实是为网格布局设计的。我对所有内容都使用了网格,因为我认为它更灵活,更容易推理。

这能回答您的问题吗?

编辑:

如果使用sticky="WE"选项而不是手动指定每个标签的宽度,则可以消除这些差距。这将使其左右延伸。修改后的代码:

from tkinter import *

def showchart_grid():
    root = Tk()

    # create 14 squares on the grid

    for i in range(1, 15):

        spot = Label(root, text='square', bg='white', height=5, width=10, borderwidth=1, relief='solid', justify=CENTER)
        spot.grid(row=1, column=i)

    # create the column labels on top of the grid in row one

    label0 = Label(root, text=0, bg="DodgerBlue", fg="white", height=2, borderwidth=1, relief='solid')
    label0.grid(row=0, column=1, sticky="WE")
    label1 = Label(root, text=1, bg='CadetBlue1', height=2, borderwidth=1, relief='solid')
    label1.grid(row=0, column=2, sticky="WE", columnspan=2)
    label2 = Label(root, text=2, bg='DodgerBlue', height=2, borderwidth=1, relief='solid')
    label2.grid(row=0, column=4, sticky="WE", columnspan=2)
    label4 = Label(root, text=4, bg='CadetBlue1', height=2, borderwidth=1, relief='solid')
    label4.grid(row=0, column=6, sticky="WE", columnspan=2)
    label6 = Label(root, text=6, bg='DodgerBlue', height=2, borderwidth=1, relief='solid')
    label6.grid(row=0, column=8, sticky="WE", columnspan=2)
    label8 = Label(root, text=8, bg='CadetBlue1', height=2, borderwidth=1, relief='solid')
    label8.grid(row=0, column=10, sticky="WE", columnspan=2)
    label11 = Label(root, text=11, bg='DodgerBlue', height=2, borderwidth=1, relief='solid')
    label11.grid(row=0, column=12, sticky="WE", columnspan=2)
    label15 = Label(root, text=15, bg="CadetBlue1", height=2, borderwidth=1, relief='solid')
    label15.grid(row=0, column=14, sticky="WE")

    mainloop()


if __name__ == '__main__':
    showchart_grid()
相关问题