Макет GUI с использованием Tk Grid Geometry Manager - PullRequest
12 голосов
/ 24 сентября 2011

Создание небольшого приложения для личного использования с Python, и я решил попробовать свои силы с небольшим программированием GUI с использованием Tkinter. Это графический интерфейс, который я создал до сих пор:

GUI layout using Tkinter

Сомнения в применении:

Как я могу убедиться, что три LableFrames - A, B и C на скриншоте - имеют одинаковую ширину? (Или, вернее, иметь ширину, равную самой широкой из трех? Например, на скриншоте A самая широкая, и я бы хотел, чтобы B и C также были такими же широкими - вплоть до линии D).

(Не нужно динамически вычислять - достаточно, чтобы я мог гарантировать, что ширина будет одинаковой при кодировании в первый раз. Они не должны изменяться во время выполнения.)

Tk Grid Geometry Manager сомневается :

  1. При использовании фреймов сетка (строка, столбец) относится только к размеру фрейма или рассчитывается на основе размера формы (корневого окна)?

  2. Как определяется размер столбца в сетке?

  3. Я не до конца понял, что «вес» делает в сетке. Когда его следует использовать?

Код Python GUI :

import Tkinter

if __name__ == '__main__':
    form = Tkinter.Tk()

    getFld = Tkinter.IntVar()

    form.wm_title('File Parser')

    stepOne = Tkinter.LabelFrame(form, text=" 1. Enter File Details: ")
    stepOne.grid(row=0, columnspan=7, sticky='W', \
                 padx=5, pady=5, ipadx=5, ipady=5)

    helpLf = Tkinter.LabelFrame(form, text=" Quick Help ")
    helpLf.grid(row=0, column=9, columnspan=2, rowspan=8, \
                sticky='NS', padx=5, pady=5)
    helpLbl = Tkinter.Label(helpLf, text="Help will come - ask for it.")
    helpLbl.grid(row=0)

    stepTwo = Tkinter.LabelFrame(form, text=" 2. Enter Table Details: ")
    stepTwo.grid(row=2, columnspan=7, sticky='W', \
                 padx=5, pady=5, ipadx=5, ipady=5)

    stepThree = Tkinter.LabelFrame(form, text=" 3. Configure: ")
    stepThree.grid(row=3, columnspan=7, sticky='W', \
                   padx=5, pady=5, ipadx=5, ipady=5)

    inFileLbl = Tkinter.Label(stepOne, text="Select the File:")
    inFileLbl.grid(row=0, column=0, sticky='E', padx=5, pady=2)

    inFileTxt = Tkinter.Entry(stepOne)
    inFileTxt.grid(row=0, column=1, columnspan=7, sticky="WE", pady=3)

    inFileBtn = Tkinter.Button(stepOne, text="Browse ...")
    inFileBtn.grid(row=0, column=8, sticky='W', padx=5, pady=2)

    outFileLbl = Tkinter.Label(stepOne, text="Save File to:")
    outFileLbl.grid(row=1, column=0, sticky='E', padx=5, pady=2)

    outFileTxt = Tkinter.Entry(stepOne)
    outFileTxt.grid(row=1, column=1, columnspan=7, sticky="WE", pady=2)

    outFileBtn = Tkinter.Button(stepOne, text="Browse ...")
    outFileBtn.grid(row=1, column=8, sticky='W', padx=5, pady=2)

    inEncLbl = Tkinter.Label(stepOne, text="Input File Encoding:")
    inEncLbl.grid(row=2, column=0, sticky='E', padx=5, pady=2)

    inEncTxt = Tkinter.Entry(stepOne)
    inEncTxt.grid(row=2, column=1, sticky='E', pady=2)

    outEncLbl = Tkinter.Label(stepOne, text="Output File Encoding:")
    outEncLbl.grid(row=2, column=5, padx=5, pady=2)

    outEncTxt = Tkinter.Entry(stepOne)
    outEncTxt.grid(row=2, column=7, pady=2)

    outTblLbl = Tkinter.Label(stepTwo, \
          text="Enter the name of the table to be used in the statements:")
    outTblLbl.grid(row=3, column=0, sticky='W', padx=5, pady=2)

    outTblTxt = Tkinter.Entry(stepTwo)
    outTblTxt.grid(row=3, column=1, columnspan=3, pady=2, sticky='WE')

    fldLbl = Tkinter.Label(stepTwo, \
                           text="Enter the field (column) names of the table:")
    fldLbl.grid(row=4, column=0, padx=5, pady=2, sticky='W')

    getFldChk = Tkinter.Checkbutton(stepTwo, \
                           text="Get fields automatically from input file",\
                           onvalue=1, offvalue=0)
    getFldChk.grid(row=4, column=1, columnspan=3, pady=2, sticky='WE')

    fldRowTxt = Tkinter.Entry(stepTwo)
    fldRowTxt.grid(row=5, columnspan=5, padx=5, pady=2, sticky='WE')

    transChk = Tkinter.Checkbutton(stepThree, \
               text="Enable Transaction", onvalue=1, offvalue=0)
    transChk.grid(row=6, sticky='W', padx=5, pady=2)

    transRwLbl = Tkinter.Label(stepThree, \
                 text=" => Specify number of rows per transaction:")
    transRwLbl.grid(row=6, column=2, columnspan=2, \
                    sticky='W', padx=5, pady=2)

    transRwTxt = Tkinter.Entry(stepThree)
    transRwTxt.grid(row=6, column=4, sticky='WE')

    form.mainloop()

(Примечание: для Python 2.4.3)

1 Ответ

11 голосов
/ 24 сентября 2011

Если вы используете один и тот же столбец и используете sticky = 'WE' на всех трех LabelFrames, тогда они должны иметь одинаковую ширину.Например, вы хотите использовать

stepTwo = Tkinter.LabelFrame(form, text=" 2. Enter Table Details: ")
stepTwo.grid(row=2, columnspan=7, sticky='WE', \
             padx=5, pady=5, ipadx=5, ipady=5)

Вопросы

1) При использовании фреймов сетка (строка, столбец) относится только кразмер фрейма или он рассчитывается исходя из размера формы (корневое окно)?

Здесь есть взаимозависимость.Предпочтительный размер формы будет зависеть от предпочтительных размеров дочерних элементов и макета, но фактические размеры дочерних элементов будут зависеть от фактического размера формы и макета.Макет выполняется от дочерних к корню, чтобы определить предпочтительные размеры, а затем, когда он добирается до корня, предпочтительный размер используется в качестве фактического размера (если не переопределен).Затем компоновка возвращается обратно, присваивая фактические размеры.

2) Как определяется размер столбца в сетке?

Предпочтительный размер столбца определяется на основебыть минимальной предпочтительной шириной всех элементов в этом ряду.Фактический размер столбца определяется предпочтительным размером плюс некоторый процент от дополнительного пространства родительского виджета.

3) Я не полностью понял, что «вес» делает в сетке.Когда его следует использовать?

Вес определяет процент дополнительного пространства, о котором я упоминал выше.Количество дополнительного пространства, выделенного для столбца, равно column_weight / total_weight.

...