簡體   English   中英

使用網格在多個Tkinter LabelFrames之間對齊小部件

[英]Aligning widgets using grid between multiple Tkinter LabelFrames

我正在嘗試創建一個Tkinter布局,該布局具有跨多個LabelFrame框垂直對齊的標簽和輸入字段。

這是一些簡化的代碼:

#!/usr/bin/python
from Tkinter import *

win = Frame()
win.grid(sticky=N+S+E+W)

frame_a = LabelFrame(win, text='Top frame', padx=5, pady=5)
frame_b = LabelFrame(win, text='Bottom frame', padx=5, pady=5)
frame_a.grid(sticky=E+W)
frame_b.grid(sticky=E+W)

for frame in frame_a, frame_b:
    for col in 0, 1, 2:
        frame.columnconfigure(col, weight=1)

Label(win, text='Hi').grid(in_=frame_a, sticky=W)
Label(win, text='Longer label, shorter box').grid(in_=frame_b, sticky=W)

Entry(win).grid(in_=frame_a, row=0, column=1, sticky=W)
Entry(win, width=5).grid(in_=frame_b, row=0, column=1, sticky=W)

win.mainloop()

上面的代碼產生一個如下所示的窗口:

上面的代碼產生的圖像不正確

而我正在尋找一種對齊字段的方法,以使窗口看起來更像這樣(感謝MS Paint):

所需的圖像

我已經使用in_ grid() in_參數,但是並沒有取得太大的成就,我想不出要嘗試的其他方法。

我知道要做的最簡單的方法是更改​​make Label文本變量,然后對照len(txt2)檢查len(txt1),然后將兩個的width變量都設置為最長。 以下代碼已關閉。 我的知識太有限,無法找出多余的空間來自何處。

    txt1 = StringVar()
    txt2 = StringVar()
    lblWidth = IntVar()
    txt1 = "Hi"
    txt2 = "Longer label, shorter box"

    if (len(txt1) > len(txt2)):
        lblWidth = len(txt1)
    else:
        lblWidth = len(txt2)

    Label(win, text=txt1, width=lblWidth, anchor=W).grid(in_=frame_a)
    Label(win, text=txt2, width=lblWidth, anchor=W).grid(in_=frame_b, sticky=W)

簡短的答案是:您無法做自己想做的事。 grid不會跨多個容器管理其行和列。

但是,至少有兩種方法可以達到您想要的效果。 一種方法是使每個容器中的第一列具有相同的顯式寬度。 為此,您可以使用grid_columnconfigure方法為每一列提供最小寬度。

另一個解決方案是為每個標簽提供相同的寬度,這將有效地將第一列的寬度設置為相同(假設每個容器中的所有列的重量相同)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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