簡體   English   中英

在同等權重的網格管理器中大小不同的按鈕?

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

按鈕B1B3位於網格的第 3 列,而B2位於第 2 列。確保它們大小相同的唯一方法是將它們的width配置設置為類似width=10的值。

所需布局:

+---------------------------------------------------------+
|                             L1                          |
+--------------+------------+--------------+--------------+
|      L2      |            |              |              |
+--------------+------------+--------------+--------------+
|                     E1                   |      B1      |
+--------------+------------+ -------------+--------------+
|      L3      |            |              |              |
+--------------+------------+--------------+--------------+
|                     E2                   |              |
+--------------+------------+ -------------+--------------+
|              |            |      B2      |      B3      |
+--------------+------------+--------------+--------------+

試圖使列盡可能接近均勻的比例。 但布局是一個 5 行 4 列的網格。 頂部 label L1將跨越第一行中的所有列。 兩個條目小部件E1E2將跨越它們各自行中的前 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM