Pythonの標準デスクトップアプリ開発フレームワーク「Tkinter」の基本理解

Python入門

Tkinterとは、Pythonが標準で備えているデスクトップアプリ開発フレームワークです。

この記事では、Tkinterの基本的な使用法について、実際のソースコードを基に解説していきます。この記事を読めば、Tkinterプログラミングの基本が理解できます。

スポンサーリンク

サンプルコード

以下のサンプルコードを例にとります。このソースコード1本で、小さなGUIアプリになっています。

import tkinter as tk
from tkinter import messagebox

entryval = ""

def show():
    global entryval

    msg = entryval.get().strip()

    messagebox.showinfo("メッセージ", msg)

msg = ""

root = tk.Tk()
    
tk.Label(root, text="メッセージ").grid(row=0, column=0)

entryval = tk.StringVar(root, msg)
entry = tk.Entry(root, textvariable=entryval)
entry.grid(row=1, column=0)

button = tk.Button(root, text="メッセージを表示", command=show)
button.grid(row=2, column=0)

root.mainloop()

起動すると…

あいうえお
と入力して、
「メッセージを表示」
を押すと…

このように、入力されたメッセージを表示するだけのシンプルなアプリですが、Tkinterのエッセンスは詰まっているので、ソースコードを詳しく解説します。

Tkinterプログラミングの基本構造

上記のソースコードはクラスを使わない書き方で書きました。

まず、TKinterのコードは

メイン部分

イベントハンドラ

に分かれます。

メイン部分の最後で

mainloop()

を呼び出して、イベントが起きたらTkinterがイベントハンドラを呼び出すようにします。
プロセスの実行の管理はTkinterが行います。

Tkinterで画面に配置する部品には、「バインド変数」というものを設定できます。
これは、入力されている値が変化すると同時に変化する変数です。

上記のコードで言うと、

entryval

はテキストフィールドの値によって変化する「バインド変数」で、globalキーワードを使ってイベントハンドラに渡しています。

イベントハンドラの中で参照しています。

今回の場合、
StringVar型
です。
簡潔に書くために初期値として””を代入していますが、str型ではありません。
StringVar型はstrやintに変換できます。

メイン部分としては、
tk.Tk()でメイン画面を作り、
画面を描画し、
バインド変数を定義し、
イベントハンドラを定義し、
mainloop()を呼び出す。
やることが複雑になっても基本はこれだけです。これさえ守れば、Tkinterのプログラムは書けます。

画面描画

画面を描画している部分を解説します。

tk.Label(root, text="メッセージ").grid(row=0, column=0)

は「ラベル」を作って、それを配置しています。

「ラベル」はLabelクラスを使います。

Labelクラスのコンストラクタの第一引数はメイン画面、textは表示するテキストです。

grid

とは、
画面全体をグリッドとして、行、列の位置にその部品を配置する
という配置の仕方です。

行、列は0から始まります。

今回のプログラムの場合、縦一列なのでgridを使わなくても配置できるのですが、参考のためにgridを使いました。

entryval = tk.StringVar(root, msg)
entry = tk.Entry(root, textvariable=entryval)
entry.grid(row=1, column=0)

は「テキストフィールド」を作って、それを配置しています。

「テキストフィールド」はEntryクラスを使います。

コンストラクタについては後述します。

button = tk.Button(root, text="メッセージを表示", command=show)
button.grid(row=2, column=0)

は「ボタン」を作って、それを配置しています。

Buttonクラスのコンストラクタの第一引数はメイン画面、textはボタンのテキスト、commandはイベントハンドラとして使う関数名です。

基本、あとはオプションが増えるだけで、これで画面は作成できます。

イベント

show
がイベントハンドラになっています。この場合、ボタンが押されると呼ばれます。

バインド

entryのコンストラクタに秘密が隠されています。

entryval = tk.StringVar(root, msg)
entry = tk.Entry(root, textvariable=entryval)

StringVarは、メイン画面とそのフィールドの値を格納しておく変数とをコンストラクタにとります。
そのStringVarをtextvariableで指定して、バインド変数の設定は完了です。

あとは、StringVarを参照する側で

msg = entryval.get().strip()

などとgetを使ってStringVarから値を取り出します。この場合文字列で取り出して、前後の空白を除去するという加工をやっています(そうしないと改行が入ることがあります)。

メッセージボックス

messagebox.showinfo("メッセージ", msg)

が「情報」のメッセージボックスを表示している部分です。
第一引数はタイトル、第二引数は表示するメッセージです。

まとめ

今回はTkinterプログラミングを、サンプルコードを通じて見てきました。
簡単な記述でGUIアプリが開発できることが理解できたと思います。

今回のサンプルコードはあくまで基本ですが、複雑なGUIになっても、構造は全く一緒です。

また、今回はクラスを使用しませんでしたが、クラスを使って書くことも可能です。今回のような簡単なものならクラスを使わなくてもいいですが、クラスを使うとglobalを使わなくても済むので、むしろクラスを使った方がTkinterプログラミングには適しているので、使ってみてください。それほど難しい設計にはならないはずです。

PythonのGUIフレームワークには他にPyQtもあります。複雑なGUIアプリに適しています。Tkinterと適宜使い分けましょう。