2011-09-24 9 views
11

Pythonでの個人的な使用のための小さなアプリケーションを構築し、Tkinterを使用してGUIプログラミングを少し試してみると思いました。これは私がこれまでに作成したGUIです:Tkグリッドジオメトリマネージャを使用したGUIレイアウト

アプリケーション疑問

GUI layout using Tkinter

どのように私は3 LableFramesことを確認することができます - スクリーンショットにA、B、Cは - 持っています同じ幅?例えば、スクリーンショットでは、Aが最も広く、BとCもDと同じ幅になるようにしたいと思います)。

(動的に計算する必要はありません。コードを実行するときに幅が同じであることを保証すれば十分です。実行時に変更する必要はありません)

Tkのグリッドジオメトリマネージャは疑う:

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

(注意:Pythonの2.4.3の場合)

答えて

10

あなたが同じcolumnspanを使用し、粘着性を使用する場合= 'WE' はすべての3つのLabelFramesに同じ幅でなければなりません。たとえば、あなたがフレームを使用すると、グリッドは、フレームのみ サイズに特異的(行、列)であるか、またはそれが

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です。

+0

非常に良い答え、ヴォーン。 –

関連する問題