5

ジオメトリを使用して Python/Tkinter で簡単な入力ダイアログを設計していgridて、予期しない動作が発生しています。このコードから始めると:

winAddNew = tk.Toplevel()
winAddNew.title('Add New Customer')
lblName = tk.Label(winAddNew,
                   anchor=tk.W,font=fntNormal,
                   text='Enter the complete name of the customer:')
entName = tk.Entry(winAddNew,
                   justify=tk.LEFT, font=fntNormal, width=20,
                   textvariable=ctrlNewCustomerName)
lblID = tk.Label(winAddNew,
                 anchor=tk.W,font=fntNormal,
                 text='Enter a unique three-character ID:')
entID = tk.Entry(winAddNew,
                 justify=tk.LEFT, font=fntNormal, width=8,
                 textvariable=ctrlNewCustomerID)
lblName.grid(row=0,column=0,columnspan=2,sticky=tk.W,padx=10,pady=(10,0))
entName.grid(row=1,column=0,columnspan=2,sticky=tk.W,padx=10,pady=(5,0))
lblID.grid(row=2,column=0,sticky=tk.W,padx=(10,0),pady=10)
entID.grid(row=2,column=1,sticky=tk.W,padx=(0,10),pady=10)

...これは、レンダリングされたウィンドウが私のマシン (Windows 7、Python 2.7.3) でどのように見えるかです。緑色の線は実際には存在しないことに注意してください。行と列の位置であると想定するものをレイアウトするために使用しているだけです。

ここに画像の説明を入力

ここまでは順調ですね。widthここで、をentNameまで設定60して、顧客名を入力するスペースをより広く確保したいと考えています。にcolumnspan設定されて2おり、すべてのウィジェットが でオプションに設定されているtk.Wためsticky、 の幅を増やしてentNameも、エントリ ウィジェット自体を広げ、それに応じてウィンドウを広げる以外に効果はないと予想しています。他のすべてのウィジェットの相対的な位置は同じままである必要があります。

いいえ。拡大entNameするentIDと、 から押し出されますlblID:

ここに画像の説明を入力

それで、私は何が欠けていますか?なぜentID元の場所にとどまらないのですか?そして、行2を独自のフレームにブロックすることを除いて、それを所定の位置に保つ方法はありますか?

4

1 に答える 1

8

エントリ ウィジェットを大きくすると、Tkinter は余分なスペースを列 0 または列 1 に割り当てる必要があります。これは、各列の「重み」に従って行われます。

重みを明示的に設定していないため、すべての列はデフォルトの重み 0 になります。ただし、あなたの場合、何かが成長する必要があります。重みを持つ列がない場合、Tkinter は最初の列を選択します。これは、entID がプッシュ オーバーされる理由を説明しています。最初の列は、ウィジェット エントリ ウィジェットに対応するために幅が広くなっています。

列 1 に重み 1 を指定すると、余分なスペースがその列に割り当てられ、列 0 は、その列を制約しているもの (つまり、列にまたがらないウィジェット) を保持するのに十分な幅になります。コマンドでこれを行いgrid_columnconfigureます。

例えば:

winAddNew.grid_columnconfigure(1, weight=1)

weight には任意の正の整数を指定できることに注意してください。比率を表しています。したがって、たとえば、列 0 を 1 に設定し、列 1 を 2 に設定すると、列 1 には、列 0 に与えられた余分なスペースの 2 倍の量が与えられます。

Tkinter は、この動作を文書化するのに不十分な仕事をしています。決定的なドキュメントは、Tcl/Tk の man ページにあります。具体的には、グリッドのマニュアル ページの「グリッド アルゴリズム」を参照してください。

于 2013-03-20T17:42:13.393 に答える