[英]How to equally expand image buttons in Tkinter with grid weight approach?
[英]Buttons differently sized in equally weighted grid manager?
為什么在網格中使用相等的權重時這些按鈕的大小不一樣?
class Screen(tk.Tk):
def __init__(self):
super().__init__()
f = tk.Frame(self)
f.pack(fill=tk.BOTH, expand=True)
f.grid_columnconfigure(0, weight=1)
f.grid_columnconfigure(1, weight=1)
f.grid_columnconfigure(2, weight=1)
f.grid_columnconfigure(3, weight=1)
l1 = tk.Label(f, text='Text')
l1.grid(row=0, column=0, columnspan=4, sticky='nsew')
l2 = tk.Label(f, text='Text', anchor='w')
l2.grid(row=1, column=0, sticky='sw')
self.e1 = tk.Entry(f)
self.e1.grid(row=2, column=0, columnspan=3, sticky='nsew')
self.b1 = tk.Button(f, text='B1')
self.b1.grid(row=2, column=3, sticky='nsew')
l3 = tk.Label(f, text='Text', anchor='w')
l3.grid(row=3, column=0, sticky='sw')
self.e2 = tk.Entry(f)
self.e2.grid(row=4, column=0, ipady=2, columnspan=3, sticky='nsew')
self.b2 = tk.Button(f, text='B2')
self.b2.grid(row=5, column=2, sticky='nsew')
self.b3 = tk.Button(f, text='B3')
self.b3.grid(row=5, column=3, sticky='nsew', command=self.test)
self.update_idletasks()
self.geometry(f'500x{self.winfo_reqheight()}')
self.resizable(False, False)
def test(self):
a = self.b1.winfo_width()
b = self.b2.winfo_width()
c = self.b3.winfo_width()
print(a, b, c)
Output: 111 110 111
按鈕B1
和B3
位於網格的第 3 列,而B2
位於第 2 列。確保它們大小相同的唯一方法是將它們的width
配置設置為類似width=10
的值。
所需布局:
+---------------------------------------------------------+
| L1 |
+--------------+------------+--------------+--------------+
| L2 | | | |
+--------------+------------+--------------+--------------+
| E1 | B1 |
+--------------+------------+ -------------+--------------+
| L3 | | | |
+--------------+------------+--------------+--------------+
| E2 | |
+--------------+------------+ -------------+--------------+
| | | B2 | B3 |
+--------------+------------+--------------+--------------+
試圖使列盡可能接近均勻的比例。 但布局是一個 5 行 4 列的網格。 頂部 label L1
將跨越第一行中的所有列。 兩個條目小部件E1
和E2
將跨越它們各自行中的前 3 列。 出於某種原因, B2
接收的尺寸較小。
編輯:我能確定的最好的是Entry
小部件會導致加權問題,但我不知道為什么。 Bryan Oakley在這里回答了相同的主題,但我很困惑為什么小部件上的默認寬度不會被網格管理器的 weight 關鍵字覆蓋。
問題:為什么在網格中使用相等的權重時這些按鈕的大小不一樣?
它只是加權的,而不是計算的。 它取決於使用的小部件和列跨度。
您總體上使用的是sticky='nsew'
,如果您不想增長到sn
,請更改為sticky='ew'
。
一種可能的選擇是,使用不同的weight=
值,給網格管理器一個提示,你希望哪個小部件更加權,例如:
f.grid_columnconfigure(0, weight=1)
f.grid_columnconfigure(1, weight=1)
f.grid_columnconfigure(2, weight=2)
f.grid_columnconfigure(3, weight=4)
另一種選擇是使用.grid_columnconfigure(c, minsize=<minsize>)
。
這會強制網格管理器遵守minsize=
列。
來源:
tkinter.__init__: def grid_columnconfigure(...
有效資源是:
- minsize(列的最小大小),
- 重量(有多少額外的空間傳播到該列)
- 墊(額外留出多少空間)
但結果也是不可預測的,充其量是固定的 window 大小。
要讓它在 window 大小調整上工作,請將<Configure>
事件綁定到Frame
和
為每一列設置相同的計算minsize=
。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
f = tk.Frame(self)
f.pack(fill=tk.BOTH, expand=True)
f.bind('<Configure>', self.on_configure)
...
def on_configure(self, event):
w = event.widget
columns = w.grid_size()[0]
minsize = w.winfo_width() // columns
for c in range(columns):
w.grid_columnconfigure(c, minsize=minsize)
if __name__ == "__main__":
App().mainloop()
用 Python 測試:3.5 - 'TclVersion':8.6 'TkVersion':8.6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.