Выравнивание виджетов с использованием сетки между несколькими Tkinter LabelFrames - PullRequest
4 голосов
/ 18 марта 2012

Я пытаюсь создать макет 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()

Приведенный выше код создает окно, которое выглядит следующим образом:

Incorrect image produced by above code

Принимая во внимание, что я ищу способ выравнивания полей, чтобы окно выглядело примерно так (благодаря MS Paint):

Desired image

Я поигрался с in_ аргументами для grid(), но не достиг очень многого, и я не могу придумать ничего другого, с чем можно было бы поэкспериментировать.

Ответы [ 2 ]

1 голос
/ 31 марта 2013

Самый простой способ, который я знаю, делать то, что вы хотите, это изменить текстовые переменные make Label, а затем проверить len (txt1) против len (txt2) и установить для переменной ширины обоих значений самое длинноеодин.Следующий код близок.Мои знания слишком ограничены, чтобы понять, откуда берется дополнительное пространство.

    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)
1 голос
/ 18 марта 2012

Короткий ответ: вы не можете делать то, что хотите.grid не управляет своими строками и столбцами в нескольких контейнерах.

Однако есть как минимум пара способов добиться желаемого эффекта.Один из способов - дать первому столбцу в каждом контейнере одинаковую ширину.Чтобы сделать это, вы можете использовать метод grid_columnconfigure, чтобы дать каждому столбцу минимальную ширину.

Другое решение состоит в том, чтобы дать каждой метке одинаковую ширину, которая фактически установит одинаковую ширину первого столбца.(при условии, что все столбцы в каждом контейнере имеют одинаковый вес).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...