使用Tk Grid Geometry Manager的GUI布局 [英] GUI layout using Tk Grid Geometry Manager

查看:359
本文介绍了使用Tk Grid Geometry Manager的GUI布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Python构建一个小型应用程序供个人使用,并认为我会用Tkinter的一些GUI编程尝试我的手。这是我迄今创建的GUI:





应用程序疑惑: 确保屏幕截图中的三个LableFrames - A,B和C具有相同的宽度? (或者说,宽度等于三者中最宽的那个?例如,在屏幕截图中,A是最宽的,我希望B和C也宽到D)。 >

(它不必动态计算 - 如果我可以确保宽度在我第一次编码时相同,这就足够了,它们不需要)



Tk Grid几何管理器的疑惑


  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.输入文件详细信息:)
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.输入表格细节:)
stepTwo.grid(row = 2,columnspan = 7,sticky ='W', \
padx = 5,pady = 5,ipadx = 5,ipa dy = 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 =选择文件:)
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 (step = 1,column = 0,sticky ='E',padx = 5,pady = 2)
outFileTb = 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(行= 2,列= 5,padx = 5,pady = 2)

outEncTxt = Tkinter.Entry(stepOne)
outEncTxt.grid(row = 2,column = 7,pady = 2)

outTblLbl = Tkinter.Label(stepTwo,\
text =输入要在语句中使用的表的名称:)
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 =输入字段)表格名称:)
fldLbl.grid(row = 4,column = 0,padx = 5,pady = 2,sticky ='W')

getFldChk = Tkinter。 Checkbutton(stepTwo,\
text =从输入文件自动获取字段,\
onvalue = 1,offvalue = 0)
getFldChk.grid(row = 4,column = 1 ,columnpan = 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 =启用交易,onvalue = 1,offvalue = 0)
transChk.grid(row = 6,sticky ='W',padx = 5,pady = 2)

transRwLbl = Tkinter.Label(stepThree,\
text == >指定每个事务的行数:)
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)

h2_lin>解决方案

如果你使用相同的columnpan,并且在所有三个LabelFrames上使用sticky ='WE',那么它们应该具有相同的宽度,例如,你想使用

  stepTwo = Tkinter.LabelFrame(form,text =2.输入表格细节:)
stepTwo.grid(row = 2, columnpan = 7,sticky ='WE',\
padx = 5,pady = 5,ipadx = 5,ipady = 5)

问题


<1>当您使用框架时,网格(行,列)只针对框架的
大小,或者根据其计算
(根窗口)的大小?

这里有一个相互依赖关系。表单的首选大小取决于孩子的首选大小和布局,但孩子的实际大小将取决于表单的实际大小和布局。布局是从子项到根目录确定首选大小,然后当它到达根目录时,首选大小将用作实际大小(除非被覆盖)。布局然后回落下来分配实际大小。


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


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


3)我的天堂不完全了解电网内的重量。何时使用

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


Building a small application for personal use with Python and thought I'd try my hand with a little GUI programming using Tkinter. This is the GUI I've created so far:

Application doubts:

How can I make sure that the three LableFrames - A, B and C in the screenshot - have the same width? (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).

(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:

  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:

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)

解决方案

If you use the same columnspan and use sticky='WE' on all three LabelFrames then they should have the same width. 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)?

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?

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. 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.

这篇关于使用Tk Grid Geometry Manager的GUI布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆