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

フリーランスエンジニアの働き方

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と適宜使い分けましょう。

エージェントへの登録はお済みですか?

今すぐフリーランスになる気がなくても、エージェントへの登録は済ませておくことをお勧めします。理由はストレスや疲労が限界に達してからだと遅いから。

現在の自身のフリーランスとしての価値・単価相場を把握できますし、条件にあった案件をキャッチできるようになるので、いざフリーランスになろうとした際に早期に手が打てます。

エージェント登録は無料なので、今はフリーランスにならなくとも登録だけはしておくべきです。

真っ先に登録すべきエージェントは、圧倒的に多くのクライアントを開拓しているDYMテック。2500社の優良な取引先と、条件交渉力が強く高条件で仕事を紹介してくれるエージェントです。

案件紹介のみでなく、エンジニアとしてのキャリア相談や業界動向のキャッチアップなど、フリーランス対してのサポートも充実していますので、初めてフリーランスに挑戦する方も安心です。

DYMテックの詳細を見る

フリーランスエンジニアの働き方
スポンサーリンク
shigotoswitchをフォローする
しごとスイッチ