使用Tk Grid Geometry Manager的GUI布局

时间:2011-09-24 13:42:27

标签: python user-interface layout grid tkinter

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

GUI layout using Tkinter

应用疑惑:

如何确保屏幕截图中的三个LableFrame - A,B和C具有相同的宽度? (或者更确切地说,宽度等于三者中最宽的一个?例如,在屏幕截图中,A是最宽的,我希望B和C也一样宽 - 直到D行。)

(它不需要动态计算 - 如果我在第一次编码时能够确保宽度相同就足够了。它们不需要在运行时更改。)

Tk Grid Geometry Manager疑惑

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

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

  3. 我还没有完全理解网格中的'权重'是什么。什么时候应该使用?
  4. 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 个答案:

答案 0 :(得分: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)

<强>问题

  

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

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

  

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

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

  

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

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