简体   繁体   English

使用Tk Grid Geometry Manager的GUI布局

[英]GUI layout using Tk Grid Geometry Manager

Building a small application for personal use with Python and thought I'd try my hand with a little GUI programming using Tkinter. 使用Python构建一个供个人使用的小应用程序,并且我想尝试使用Tkinter进行一些GUI编程。 This is the GUI I've created so far: 这是我到目前为止创建的GUI:

使用Tkinter的GUI布局

Application doubts: 应用疑虑:

How can I make sure that the three LableFrames - A, B and C in the screenshot - have the same width? 如何确保屏幕截图中的三个LableFrame - A,B和C具有相同的宽度? (Or rather, have the width equal to the widest of the three? For example, in the screenshot, A is the widest and I'd like B and C to also be as wide - up to the line D). (或者更确切地说,宽度等于三个中最宽的?例如,在屏幕截图中,A是最宽的,我希望B和C也一样宽 - 直到D行)。

(It doesn't have to dynamically calculated - it is enough if I can ensure that the width are the same when I code it, the first time round. They don't need to change on runtime.) (它不需要动态计算 - 如果我在第一次编码时能够确保宽度相同就足够了。它们不需要在运行时更改。)

Tk Grid Geometry Manager doubts : Tk Grid Geometry Manager疑惑

  1. When you use frames, is the grid (row, column) specific to only the size of the frame or is it calculated based on the size of the form (root window)? 当您使用框架时,网格(行,列)是否仅特定于框架的大小,还是基于窗体的大小(根窗口)计算?

  2. How is the size of a column determined in a grid? 如何在网格中确定列的大小?

  3. I haven't fully understood what 'weight' does within a grid. 我还没有完全理解网格中的'权重'是什么。 When should it be used? 什么时候应该使用?

The Python GUI Code : 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: For Python 2.4.3) (注意:对于Python 2.4.3)

If you use the same columnspan and use sticky='WE' on all three LabelFrames then they should have the same width. 如果你使用相同的columnspan并在所有三个LabelFrame上使用sticky ='WE',那么它们应该具有相同的宽度。 For example, you want to use 例如,您想要使用

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)

Questions 问题

1) When you use frames, is the grid (row, column) specific to only the size of the frame or is it calculated based on the size of the form (root window)? 1)当你使用框架时,网格(行,列)是否仅特定于框架的大小,还是根据窗体的大小(根窗口)计算的?

There is an interdependence here. 这里有一种相互依赖。 The preferred size of the form will depend on the preferred sizes of the children and the layout, but the actual sizes of the children will depend on the actual size of the form and the layout. 表单的首选大小取决于子项的首选大小和布局,但子项的实际大小将取决于表单的实际大小和布局。 Layout is done from the children to the root to determine the preferred sizes, and then when it gets to the root, the preferred size is used as the actual size (unless overridden). 从子项到根完成布局以确定首选大小,然后当它到达根时,首选大小用作实际大小(除非被覆盖)。 Layout then goes back down assigning actual sizes. 布局然后返回分配实际尺寸。

2) How is the size of a column determined in a grid? 2)如何在网格中确定列的大小?

The preferred size of a column is determined based to be the minimum preferred width of all the items in that row. 根据该行中所有项目的最小首选宽度确定列的首选大小。 The actual size of the column is determined by the preferred size plus some percentage of the extra space of the parent widget. 列的实际大小由首选大小加上父窗口小部件的额外空间的一定百分比确定。

3) I haven't fully understood what 'weight' does within a grid. 3)我还没有完全理解网格中的“权重”是什么。 When should it be used? 什么时候应该使用?

The weight determines the percentage of extra space that I mentioned above. 重量决定了我上面提到的额外空间的百分比。 The amount of the extra space given to the column is column_weight/total_weight. 给列提供的额外空间量是column_weight / total_weight。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM