[英]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.