Python 关于在网格中对齐Tkinter中的帧,尝试在帧中使用.grid()和.pack()获得相同结果的问题
python新手,从这个网站上获得了很多非常好的信息 我正在使用.grid()创建一个图表,然后再次使用.pack()中的框架作为练习,看看是否可以得到相同的结果 函数showchart_grid()可以工作并产生我想要创建的内容。这是一个图表,最下面一行是14个正方形,最上面一行是这些正方形的标签,有时列标签跨越2个正方形。您可以在columnspan=属性中看到这一点。第0行中的列标签之间有一些奇怪的空格,但除此之外,所有的列标签都对齐了Python 关于在网格中对齐Tkinter中的帧,尝试在帧中使用.grid()和.pack()获得相同结果的问题,python,python-3.x,macos,tkinter,Python,Python 3.x,Macos,Tkinter,python新手,从这个网站上获得了很多非常好的信息 我正在使用.grid()创建一个图表,然后再次使用.pack()中的框架作为练习,看看是否可以得到相同的结果 函数showchart_grid()可以工作并产生我想要创建的内容。这是一个图表,最下面一行是14个正方形,最上面一行是这些正方形的标签,有时列标签跨越2个正方形。您可以在columnspan=属性中看到这一点。第0行中的列标签之间有一些奇怪的空格,但除此之外,所有的列标签都对齐了 def showchart_grid():
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()
从根本上说,网格是二维布局。如果将两个项目指定给同一列,则它们将垂直排列 另一方面,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()
当然可以。最后,我希望在最下面一行的每个方块上都有一个背景图像,然后在该图像上有文本。在网格方法中这仍然是可能的吗?是的,这应该是可能的。将图像和文本指定到同一网格位置,并确保文本位于顶部且背景透明。但在这个问题上应该还有其他答案;-)你能将答案标记为已解决(投票按钮旁的复选标记)?这将向其他人表明你的问题已经得到了回答,也会让回答者(在本例中是我)获得一些声誉。谢谢:-)我更新了我的答案,修改了一个小代码,消除了标签之间的差距完美!谢谢你——事实上我已经猜出了:)。目前正在努力学习如何使我的标签背景透明。看来我得用帆布了?当然可以。最后,我希望在最下面一行的每个方块上都有一个背景图像,然后在该图像上有文本。在网格方法中这仍然是可能的吗?是的,这应该是可能的。将图像和文本指定到同一网格位置,并确保文本位于顶部且背景透明。但在这个问题上应该还有其他答案;-)你能将答案标记为已解决(投票按钮旁的复选标记)?这将向其他人表明你的问题已经得到了回答,也会让回答者(在本例中是我)获得一些声誉。谢谢:-)我更新了我的答案,修改了一个小代码,消除了标签之间的差距完美!谢谢你——事实上我已经猜出了:)。目前正在努力学习如何使我的标签背景透明。看来我得用帆布了?