PythonでGUIアプリを作成できるモジュール tkinter(ティーキンター)で Widget(ウィジェット) を配置する pack について解説します。
本記事での Widget の定義には Frame も含みます。
サンプルコードはモジュールのインポートを from tkinter import *
としています。
関数を呼び出す際にパッケージ名の接頭辞 (tk.Frame()
のtk.
)を省略できるのでおすすめです。
pack とは
pack は Widget をウィンドウの中に縦または横に並べて配置する時に使用します。
簡単なサンプルを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | from tkinter import * root = Tk() root.title('packの使い方') root.geometry('300x150') # Frame設定 frame = Frame(root) # Frameをpackで配置 frame.pack(expand=True, fill=BOTH) # Widget(ボタン)設定 button1 = Button(frame, text="ボタン1") button2 = Button(frame, text="ボタン2") button3 = Button(frame, text="ボタン3") button4 = Button(frame, text="ボタン4") # Widget(ボタン)をpackで配置 button1.pack() button2.pack() button3.pack() button4.pack() root.mainloop() |
pack のオプション一覧
pack で指定可能なオプション一覧です。
オプション | 説明 | 値の形式 |
---|---|---|
side | Widgetを配置する方向を指定(上下左右) デフォルトはTOP | TOP, BOTTOM, LEFT, RIGHT |
anchor | sideで配置された後の配置位置(寄せる方向)を指定 デフォルトはCENTER | (基本)CENTER, N, S, W, E (組合せ)NW, NE, SW, SE |
expand | Widgetを残りのスペースを埋めるかを指定 デフォルトはFalse | True, False |
fill | Widgetを縦・横または両方向に引き伸ばす | X, Y, BOTH, NONE |
before | 配置済みのWidgetの前にWidgetを配置 | Widget名 |
after | 配置済みのWidgetの後にWidgetを配置 | Widget名 |
ipadx | 内側・横方向のスペース | ピクセル値 |
ipady | 内側・縦方向のスペース | ピクセル値 |
padx | 外側・横方向のスペース | ピクセル値 |
pady | 外側・縦方向のスペース | ピクセル値 |
in_ | 親Widgetを指定 | Widgetオブジェクト名 |
配置方向を指定(side)
ウィジェットの上下左右の配置方向を指定します。
値は、上=TOP
, 下=BOTTOM
, 左=LEFT
, 右=RIGHT
になります。
左詰めで配置する例です。
1 2 3 4 | button1.pack(side=LEFT) button2.pack(side=LEFT) button3.pack(side=LEFT) button4.pack(side=LEFT) |
side の指定順序によって配置位置が変わってくるため注意が必要です。
以下の例ではLEFT→TOP→RIGHT→BOTTOMの順に配置していますが、それぞれ中心位置からずれてしまいます。
1 2 3 4 | button1.pack(side=LEFT) button2.pack(side=TOP) button3.pack(side=RIGHT) button4.pack(side=BOTTOM) |
これは pack が専有領域を持っていて、その領域を避けて配置することで発生します。
それぞれの専有領域を図示すると下図のようになります。
各ボタンを画面の中心に配置したい場合は、以下の順序で配置します。
1 2 3 4 | button1.pack(side=TOP) button2.pack(side=BOTTOM) button3.pack(side=LEFT) button4.pack(side=RIGHT) |
専有領域を図示すると以下のようになっています。
配置の基準位置を指定(anchor)
side
で配置した後の領域内での基準位置を指定します。
上下左右=北南西東として頭文字の記号の組み合わせで指定します。
値は、上=N
, 下=S
, 右=E
, 左=W
となります。
記号と位置関係は下図のようになります。
1 2 3 4 | button1.pack(side=TOP, anchor=W) button2.pack(side=BOTTOM, anchor=E) button3.pack(side=LEFT, anchor=S) button4.pack(side=RIGHT, anchor=N) |
anchor では下図のように pack で専有している領域内で寄せられます。
残りのスペースを埋める(expand)
expand=True
とした時に、残っている領域全てを占有領域とします。
以下の例ではボタン2の領域以外を、ボタン1の領域として専有します。
1 2 | button1.pack(expand=True) button2.pack() |
領域を図示すると下図のようになります。
2個以上の Widgetに expand=True
を指定すると、均等割付になります。
1 2 | button1.pack(expand=True) button2.pack(expand=True) |
領域を図示します。
Widgetを引き伸ばす(fill)
Widget を領域内いっぱいまで、縦・横または両方向に引き伸ばします。
値は、横=X
、縦=Y
、両方向=BOTH
で縦横両方向に引き伸ばします。
1 2 3 | button1.pack(fill=X) button2.pack(expand=True, fill=Y) button3.pack(expand=True, fill=BOTH) |
配置済みのWidgetの前後に配置(before, after)
既に配置済のWidgetの前後にWidgetを配置します。
1 2 3 4 | button1.pack() button2.pack(before=button1) button3.pack() button4.pack(after=button1) |
内部のスペースを追加(ipadx, ipady)
Widget 内部のスペース(パディング)を設定できます。
横方向のスペースは ipadx
, 縦方向のスペースは ipady
で指定します。
1 2 | button1.pack() button2.pack(ipadx=50, ipady=30) |
外側のスペースを追加(padx, pady)
Widgetの外側のスペース(パディング)を設定できます。
横方向のスペースは padx
, 縦方向のスペースは pady
で指定します。
1 2 3 4 | button1.pack() button2.pack(side=LEFT, expand=True, fill=BOTH) button3.pack(side=LEFT, expand=True, fill=BOTH, padx=50, pady=20) button4.pack(side=LEFT, expand=True, fill=BOTH) |
親Widgetの指定(in_)
基本はWidgetの設定で配置する親Widgetを指定しますが、in_
を使用することで、pack()
内で指定することが出来ます。
1 2 3 4 5 6 | frame = Frame(root) button1 = Button(text="ボタン1") button2 = Button(text="ボタン2") button1.pack(in_=frame) button2.pack(in_=frame) |
Frame のサイズを固定(propagate)
Frame を pack で配置すると、デフォルトでは他のWidgetに合わせてサイズが自動で伸縮します。
サイズを固定したい場合は、propagate(False)
または pack_propagate(False)
を指定することでサイズを固定できます。
・関連記事:【Python/tkinter】Frameの使い方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | from tkinter import * root.title('packの使い方') root.geometry('300x150') root = Tk() # Frame設定・配置 frame = Frame(root, width=200, height=100, borderwidth=1, relief='solid') frame.propagate(False) frame.pack() # ボタン設定・配置 button1 = Button(frame, text="ボタン1") button2 = Button(frame, text="ボタン2") button3 = Button(frame, text="ボタン3") button4 = Button(frame, text="ボタン4") button1.pack(side=TOP) button2.pack(side=BOTTOM) button3.pack(side=LEFT) button4.pack(side=RIGHT) root.mainloop() |
分かりやすいようにFrameの外側を枠線で表しています。
tkinter pack の使い方を解説しました。
以下の記事も参考にしてみて下さい。
・関連記事:PythonでGUIアプリを作成する(tkinter)
・関連記事:【Python/tkinter】Frameの使い方
・関連記事:【Python/tkinter】Widgetの配置(grid)
・関連記事:【Python/tkinter】Widgetの配置(place)