Графический интерфейс GUI с использованием Tk Grid Geometry Manager

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

GUI layout using Tkinter

Требования к приложениям:

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

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

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

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

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

  • Я не совсем понял, что такое "вес" в сетке. Когда он должен использоваться?

Код GUI Python:

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

Если вы используете те же столбцы и используете 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.