使用Tk Grid布局管理器的GUI布局

13

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

使用Tkinter布局的GUI

应用程序疑问:

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

(它不必动态计算 - 只要我第一次编写代码时可以确保宽度相同即可。它们不需要在运行时更改。)

Tk Grid Geometry Manager疑问

  1. 当您使用框架时,网格(行、列)是否仅适用于框架的大小,还是根据表单的大小(根窗口)计算的?

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

  3. 我还没有完全理解网格中'weight'的作用。何时应该使用?

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()
(Note: 对于 Python 2.4.3 版本)
1个回答

14

如果您在所有三个LabelFrame上使用相同的columnspan并且在它们上面使用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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接