この記事は、PythonでGUIアプリを作成するための内容となります。
tkinterを用いて、gridによってWidgetを配置させていきます。
gridによるWidget配置の実例です。

この記事では、このような表示を実現する方法を解説しています。
gridで格子状の表現ができれば、それなりにGUIアプリのようにはなります。
まずは、そこを目指しましょう。
本記事の内容
- PythonでGUIアプリの基本画面を作成する
- 【サンプルコード】tkinterのgridによるWidget配置
- 「ねばねば」stickyの使い方
それでは、上記に沿って解説していきます。
PythonでGUIアプリの基本画面を作成する
本記事では、tkinterを用いて以下の基本画面を作成できることを前提とします。

本記事を理解するための前提となるポイントをまとめておきます。
- tkinterをインストール済み
- tkinterでボタン(Widget)をウィンドウに配置できる
それぞれを説明します。
tkinterをインストール済み
PythonでGUIアプリを作成するための大前提です。
tkinterがなければ、話は進みません。
インストールと言っていますが、「Python 3なら何もする必要はない」です。
tkinterは、Python 3の標準ライブラリとして何もしなくても利用できます。
tkinterでボタン(Widget)をウィンドウに配置できる
つまりは、簡単な画面を開発できるということです。
tkinterを使って、画面を作れるレベルを求めています。
この程度のレベルなら、経験のあるプログラマーなら数時間もかかりません。
次の記事を読めば、求めているレベルへすぐに到達できます。
【サンプルコード】tkinterのgridによるWidget配置
本記事の冒頭で示した画面のコードです。
import tkinter as tk # 画面作成 window = tk.Tk() window.geometry( "400x300" ) window.title( "gridでWidget配置" ) # ボタン作成 btn_00 = tk.Button(window, text = "ボタン00" ) btn_01 = tk.Button(window, text = "ボタン01" ) btn_02 = tk.Button(window, text = "ボタン02" ) btn_10 = tk.Button(window, text = "ボタン10" ) btn_11 = tk.Button(window, text = "ボタン11" ) btn_12 = tk.Button(window, text = "ボタン12" ) btn_20 = tk.Button(window, text = "ボタン20" ) btn_21 = tk.Button(window, text = "ボタン21" ) btn_22 = tk.Button(window, text = "ボタン22" ) btn_30 = tk.Button(window, text = "ボタン30" ) btn_31 = tk.Button(window, text = "ボタン31" ) btn_32 = tk.Button(window, text = "ボタン32" ) btn_40 = tk.Button(window, text = "ボタン40" ) btn_41 = tk.Button(window, text = "ボタン41" ) btn_42 = tk.Button(window, text = "ボタン42" ) btn_50 = tk.Button(window, text = "ボタン50" ) btn_51 = tk.Button(window, text = "ボタン51" ) btn_52 = tk.Button(window, text = "ボタン52" ) # ボタン表示 btn_00.grid(row = 0 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_01.grid(row = 0 , column = 1 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_02.grid(row = 0 , column = 2 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_10.grid(row = 1 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_11.grid(row = 1 , column = 1 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_12.grid(row = 1 , column = 2 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_20.grid(row = 2 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_21.grid(row = 2 , column = 1 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_22.grid(row = 2 , column = 2 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_30.grid(row = 3 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_31.grid(row = 3 , column = 1 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_32.grid(row = 3 , column = 2 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_40.grid(row = 4 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_41.grid(row = 4 , column = 1 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_42.grid(row = 4 , column = 2 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_50.grid(row = 5 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_51.grid(row = 5 , column = 1 , sticky = (tk.N, tk.S, tk.E, tk.W)) btn_52.grid(row = 5 , column = 2 , sticky = (tk.N, tk.S, tk.E, tk.W)) # ウィンドウ(親)サイズとの同期設定 window.columnconfigure( 0 , weight = 1 ) window.columnconfigure( 1 , weight = 1 ) window.columnconfigure( 2 , weight = 1 ) window.rowconfigure( 0 , weight = 1 ) window.rowconfigure( 1 , weight = 1 ) window.rowconfigure( 2 , weight = 1 ) window.rowconfigure( 3 , weight = 1 ) window.rowconfigure( 4 , weight = 1 ) window.rowconfigure( 5 , weight = 1 ) # 画面常駐 window.mainloop() |
正直、ウンザリするコードです。
もっと効率的に書けます。
しかし、tkinterのgridの使い方を理解するには最適でしょう。
さらに理解しやすいために、まず「# ウィンドウ(親)サイズとの同期設定」を無効(コメント)にします。
その状態でコードを実行すると以下のようになります。
ここでは、「ウィンドウにstickyしないgrid画面」と呼びます。

この結果を見ればわかるように、gridによるWidget配置は「grid()」がポイントだとわかります。
gridメソッド利用箇所を一つだけ抽出。
btn_00.grid(row = 0 , column = 0 , sticky = (tk.N, tk.S, tk.E, tk.W)) |
ここでボタンを位置指定で表示した際のコードを思い出してください。
次のようにplaceメソッドを利用していました。
btn.place(x = 125 , y = 230 , width = 150 , height = 40 ) |
比較すればわかるように、placeとgridが異なるだけです。
もちろん、それぞれのメソッドの引数は異なります。
大体のイメージは掴めたと思います。
では、次にgrid()の引数を見ていきます。
- row
- column
- sticky
とりあえず、上記の3つがあれば事足ります。
rowやcolumnが0で始まるのは、プログラミングをやる上では常識ですね。
細かい部分は、手を動かして理解してください。
そのためにウザイと感じるコードにしています。
あと、rowとcolumnだけでも「ウィンドウにstickyしないgrid画面」は実現できます。
btn_00.grid(row = 0 , column = 0 ) btn_01.grid(row = 0 , column = 1 ) btn_02.grid(row = 0 , column = 2 ) |
このようにしても、結果は同じということです。
ということは、次のようなことがわかりますね。
『「# ウィンドウ(親)サイズとの同期設定」とgrid()の引数stickyは関連がある』
なお、stickyの日本語訳は「ねばねば」です。
粘着性があってウィンドウ(親)に引っ付くという感じですね。
では、この「ねばねば」を最後に説明しておきます。
「ねばねば」stickyの使い方
まず、stickyを無効にして「# ウィンドウ(親)サイズとの同期設定」を有効にします。
具体的には、以下の2つを有効にしてください。
- rowconfigure
- columnconfigure
その状態で実行すると、次の画面が表示されます。

この結果からわかることは、rowconfigureとcolumnconfigureが表示分割を行うということです。
分割の際のサイズは、引数weightの値によります。
この状態からgrid()の引数stickyを復活させます。
ただし、sticky=(tk.N, tk.S)とします。
btn_00.grid(row = 0 , column = 0 , sticky = (tk.N, tk.S)) btn_01.grid(row = 0 , column = 1 , sticky = (tk.N, tk.S)) btn_02.grid(row = 0 , column = 2 , sticky = (tk.N, tk.S)) ・・・ |
実行すると、次の画面となります。

勘の鋭い方は、もうわかったと思います。
tk.NはNorthで上
tk.SはSouthで下
それぞれの方向にねばねばと伸びるということです。
では、念のために逆も確認しておきましょう。
逆とは、sticky=(tk.E, tk.W)のことです。
btn_00.grid(row = 0 , column = 0 , sticky = (tk.E, tk.W)) btn_01.grid(row = 0 , column = 1 , sticky = (tk.E, tk.W)) btn_02.grid(row = 0 , column = 2 , sticky = (tk.E, tk.W)) ・・・ |
実行すると、やはり思った通りの画面ですね。

これで「ねばねば」stickyに関しては、大丈夫ですね。
あとは、「E」だけ、「WとS」だけなどを試してみてください。
もちろん、各行・各列毎に異なるstikcyの値でもよいでしょう。
以上、「tkinterでgridによるWidget配置」を終わりとします。