Python Tkinter¶
はじめに¶
Tkinter¶
Python標準GUIライブラリです。
https://docs.python.org/ja/3/library/tkinter.html
Tcl/Tk(スクリプト言語TclとGUIライブラリのTk)をラップしたGUIライブラリです。
基本的なウィジェットと3種類のジオメトリマネージャがあります。
同じウィジェットについて、初期からのものと、ttk(テーマ付きウィジェット)の2種類があります。(一部のウィジェットはどちらかのみ)
最初の一歩¶
最低限のウィンドウ表示¶
import tkinter as tk
root = tk.Tk()
root.mainloop()
- Tkinterライブラリをimportします。慣習的に、別名 tk を適用します。
- Tk()でトップレベルウィンドウを生成します。
- mainloopメソッドを呼ぶと、GUIイベントループに入りGUIのイベント処理が開始されます。

サイズ指定¶
root = tk.Tk()
root.geometry("640x400")
- ウィンドウの幅と高さを指定します。
画面上の表示位置を指定する場合は、root.geometry("640x400+640+192") のように、幅 x 高さ + 表示位置(横)+ 表示位置(縦)と指定します。
ウィジェットの配置¶
ラベルとボタンの2つのウィジェットを並べます。
ウィジェットの配置は、3種類あるジオメトリマネージャのうちPackerを使います。
import tkinter as tk
root = tk.Tk()
root.geometry('192x96')
label = tk.Label(root, text='Hello, world')
label.pack()
button = tk.Button(root, text='ご挨拶', command=lambda: label.configure(text='Welcome to Python/Tkinter'))
button.pack()
root.mainloop()
| 実行直後 | ボタン押下後 |
|---|---|
![]() |
![]() |
- トップレベルウィンドウを大きさ192x96で生成
- ラベルにテキスト「Hello, world」を設定し、トップレベルウィンドウの子ウィジェットとして生成
- ボタンにテキスト「ご挨拶」を設定し、ボタン押下時にラベルのテキストを「Welcome to Python/Tkinter」に変更するイベント処理を設定し、トップレベルウィンドウの子ウィジェットとして生成
- 1つ目のウィジェットとしてラベルをpackメソッドで配置
- 2つ目のウィジェットとしてボタンをpackメソッドで配置
packメソッドは、デフォルトでside=TOPとなるので、ウィジェットを上から下へ配置
次の一歩¶
クラスで定義¶
最初の一歩で作った スクリプト をクラスで記述します。
import tkinter as tk
class App(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.label = tk.Label(self, text='Hello, world')
self.label.pack()
self.button = tk.Button(self, text='ご挨拶', command=lambda: self.label.configure(text='Welcome to Python/Tkinter'))
self.button.pack()
def main():
root = tk.Tk()
root.geometry('192x96')
app = App(root)
app.mainloop()
if __name__ == '__main__':
main()
ジオメトリマネージャ¶
Placer¶
placeメソッドで、指定した座標に配置します。
Packer¶
Packerは、packメソッドを呼んだ際に指定されたsideからウィジェットを詰めていきます。sideの指定は、TOP, LEFT, RIGHT, BOTTOMのいずれかです。
packメソッドで指定するオプション¶
| オプション | 選択肢 | 内容 |
|---|---|---|
| side | TOP , BOTTOM, LEFT, RIGHT | 親ウィジェットに詰めるときの並び方向 |
| expand | 0, 1 | 親ウィジェットに詰めたときに、余白があればこのウィジェットを余白いっぱいに広げるか否か |
| anchor | N, NE, E, SE, S, SW, W, NW, CENTOR | ウィジェットの配置領域の中でどの箇所にウィジェットを寄せるかを指定 |
| fill | NONE , X, Y, BOTH | ウィジェットの配置領域の指定方向一杯にウィジェットを広げる |
| padx pady | 数値(ピクセル) | ウィジェットの外側に空白を設ける |
| ipadx ipady | 数値(ピクセル) | ウィジェットの内側の境界に空白を設ける |
1 下線はデフォルトを示す
Gridder¶
girdメソッドで格子状に配置します。
ウィジェット¶
標準ウィジェット¶
- Frame ウィジェットを束ねる
- Label 文字列やイメージ
- Message 複数行の文字列
- Button
- RadioButton
- CheckButton
- ListBox
- Scrollbar
- Scale 進捗バー
- Entry 1行の文字列入力
- MenuButton
- Bitmap
- Canvas
- Text
- LabelFrame
- Spinbox
- PanedWindow
オプション(抜粋)
- foreground (fg) 文字・線を描く色
- background 背景色
- text
- textvariable
- image
- bitmap
- borderwidth (bd)
- relief
- height
- width
- anchor
ウィジェットの生成は w = ウィジェットクラス(parent, option=value, ...)
ttkウィジェット¶
見た目を Style で定義するウィジェットです。クロスプラットフォームで共通性を高める効果があるようです。オリジナルのウィジェットと見た目の定義方法が変わります。
スレッド¶
メインスレッドでmainloopを呼びます。
スレッドを起こすには、threading.Thread
タイマー(tkinger)は、一定時間が経過した後、指定した関数を実行します。
root = tk.Tk()
:
root.after(時間, 実行したい関数)

