PythonでGUIアプリを作成できるモジュール tkinter(ティーキンター)で Widget(ウィジェット) を配置する grid について解説します。
本記事での Widget の定義には Frame も含みます。
サンプルコードはモジュールのインポートを from tkinter import *
としています。
関数を呼び出す際にパッケージ名の接頭辞 (tk.Frame()
のtk.
)を省略できるのでおすすめです。
grid とは
grid は Widgetを配置するメソッドで、ウィンドウの中にグリッド状(格子状)にレイアウトすることができます。
エクセルのセルを利用して表を作るイメージで、セルを結合するような設定や、grid で配置した Frame の中に、Widget を grid で配置することもできます。
grid のオプション一覧
grid で指定可能なオプション一覧です。
オプション | 説明 | 値の形式 |
---|---|---|
row | Widgetを配置する縦方向の位置 | 行番号(0始まり) |
column | Widgetを配置する横方向の位置 | 列番号(0始まり) |
columnspan | 横方向に結合する数 | 整数(2以上) |
rowspan | 縦方向に結合する数 | 整数(2以上) |
sticky | グリッド内に配置する位置 上下左右=北南西東として頭文字の記号で指定 (上=N, 下=S, 右=E, 左=W) デフォルトは中央に配置(CENTER) Frameを結合する場合は指定が必要 | (基本)N, S, W, E (組合せ)NW, NE, SW, SE, NSEW またはN+Sなど |
ipadx | 内側・横方向のスペース | ピクセル値 |
ipady | 内側・縦方向のスペース | ピクセル値 |
padx | 外側・横方向のスペース | ピクセル値 |
pady | 外側・縦方向のスペース | ピクセル値 |
in_ | 親Widgetを指定 | Widgetオブジェクト名 |
横・縦位置(row, column)
格子状の横位置、縦位置を row
, column
で指定します。
位置の数字は0始まりで、左上が原点(0,0)になります。
1 2 3 4 | label1.grid(column=0, row=0) label2.grid(column=0, row=1) label3.grid(column=1, row=0) label4.grid(column=1, row=1) |
横・縦方向の結合(columnspan, rowspan)
columnspan
, rowspan
を指定することでグリッドを結合する事ができます。
下の例では、「ラベル1」を縦方向に2個分、「ラベル4」を横方向に2個分結合しています。sticky=N+S
または E+W
を同時に指定する事で、隣接する Widget の幅・高さまで要素を引き伸ばすことが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # フレーム配置 frame = Frame(root) frame.grid() # 設定 label1 = Label(frame, height=5, width=10, text="ラベル1", bg="pink") label2 = Label(frame, height=5, text="ラベル2", bg="skyblue") label3 = Label(frame, height=5, text="ラベル3", bg="white") label4 = Label(frame, text="ラベル4", bg="seagreen") # gridで配置 label1.grid(column=0, row=0, rowspan=2, sticky=N+S) label2.grid(column=1, row=0) label3.grid(column=1, row=1) label4.grid(column=0, row=2, columnspan=2, sticky=E+W) |
Frame を結合したい場合は、後述のsticky=EW
または NS
を指定して下さい。指定しないと正常に結合されません。
グリッド内に配置する位置(sticky)
グリッド内に配置する位置を指定することができます。
上下左右=北南西東として頭文字の記号の組み合わせで指定します。
値は、上=N
, 下=S
, 右=E
, 左=W
となります。
記号と位置関係は下図のようになります。
注)Frame を columnspan
, rowspan
で結合配置する場合は sticky=EW
または NS
の指定が必要です。
指定しないと Frame が結合されません。
1 2 3 4 | frame1.grid(column=0, row=0) frame2.grid(column=0, row=1) frame3.grid(column=1, row=0, rowspan=2, sticky=N+S) frame4.grid(column=0, row=2, columnspan=2, sticky=E+W) |
分かりやすいようにFrameの外側を枠線で表しています。
内部のスペースを追加(ipadx, ipady)
ipadx
, ipady
で Widget 内部のスペース(パディング)を設定できます。
横方向のスペースは ipadx
, 縦方向のスペースは ipady
で指定します。
1 2 3 4 | label1.grid(column=0, row=0, rowspan=2, sticky=N+S) label2.grid(column=1, row=0, ipadx=40) label3.grid(column=1, row=1, ipady=40) label4.grid(column=0, row=2, columnspan=2, sticky=W+E) |
外側のスペースを追加(padx, pady)
padx
, pady
で Widgetの外側のスペース(パディング)を設定できます。
横方向のスペースは padx
, 縦方向のスペースは pady
で指定します。
1 2 3 4 | label1.grid(column=0, row=0, rowspan=2, sticky=N+S) label2.grid(column=1, row=0 ) label3.grid(column=1, row=1) label4.grid(column=0, row=2, columnspan=2, padx=20, pady=20, sticky=W+E) |
親Widgetの指定(in_)
基本はWidgetの設定で配置する親Widgetを指定しますが、in_
を使用することで、grid()
内で指定することが出来ます。
1 2 3 4 5 6 7 8 9 10 | frame = Frame(root) frame.grid() # 設定 label1 = Label(text="ラベル1", bg="pink") label2 = Label(text="ラベル2", bg="skyblue") # gridで配置 label1.grid(in_=frame, column=0, row=0) label2.grid(in_=frame, column=1, row=0) |
Frame のサイズを固定(grid_propagate)
Frame を grid で配置すると、デフォルトでは他のWidgetに合わせてサイズが自動で伸縮します。
サイズを固定したい場合は、grid_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 22 23 | from tkinter import * root = Tk() cnf={'borderwidth':2, 'relief':'solid'} frame1 = Frame(root, width=250, height=150, cnf=cnf) frame2 = Frame(root, width=250, height=150, cnf=cnf) # サイズを固定 frame1.grid_propagate(False) frame2.grid_propagate(False) # gridで配置 frame1.grid(row=0, column=0) frame2.grid(row=1, column=0) # ラベル配置 label1 = Label(frame1, text="ラベル1", bg="pink") label2 = Label(frame2, text="ラベル2", bg="skyblue") label1.grid() label2.grid() root.mainloop() |
分かりやすいようにFrameの外側を枠線で表しています。
tkinter grid の使い方を解説しました。
以下の記事も参考にしてみて下さい。
・関連記事:PythonでGUIアプリを作成する(tkinter)
・関連記事:【Python/tkinter】Frameの使い方
・関連記事:【Python/tkinter】Widgetの配置(pack)
・関連記事:【Python/tkinter】Widgetの配置(place)