繁体   English   中英

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

[英]Question about lining up frames in Tkinter within a grid, attempting to achieve identical results with .grid() and .pack() within a frame

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这些功能是因为它们将接受输入并按原样调整图表,但现在我只是将其留为“空”。

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

另一方面,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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM