使用Tk Grid Geometry Manager的GUI布局

Sam*_*Sam 12 python grid layout user-interface tkinter

使用Python构建一个供个人使用的小应用程序,并且我想尝试使用Tkinter进行一些GUI编程.这是我到目前为止创建的GUI:

使用Tkinter的GUI布局

应用疑虑:

如何确保屏幕截图中的三个LableFrame - 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()
Run Code Online (Sandbox Code Playgroud)

(注意:对于Python 2.4.3)

Vau*_*ato 11

如果你使用相同的columnspan并在所有三个LabelFrame上使用sticky ='WE',那么它们应该具有相同的宽度.例如,您想要使用

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)
Run Code Online (Sandbox Code Playgroud)

问题

1)当你使用框架时,网格(行,列)是否仅特定于框架的大小,还是根据窗体的大小(根窗口)计算的?

这里有一种相互依赖.表单的首选大小取决于子项的首选大小和布局,但子项的实际大小将取决于表单的实际大小和布局.从子项到根完成布局以确定首选大小,然后当它到达根时,首选大小用作实际大小(除非被覆盖).布局然后返回分配实际尺寸.

2)如何在网格中确定列的大小?

根据该行中所有项目的最小首选宽度确定列的首选大小.列的实际大小由首选大小加上父窗口小部件的额外空间的一定百分比确定.

3)我还没有完全理解网格中的"权重"是什么.什么时候应该使用?

重量决定了我上面提到的额外空间的百分比.给列提供的额外空间量是column_weight/total_weight.