PythonでGUIアプリを作成する(tkinter)

pythonでGUIアプリを作成(tkinter)
スポンサーリンク
スポンサーリンク

PythonでGUIアプリを作成できるモジュール tkinter(ティーキンター)の使い方を解説します。

この記事を読めば基本的な操作方法をマスターできるようになります。

スポンサーリンク

tkinterとは

簡単にGUIを作成することができるツールキットで、GUI画面 から Python スクリプトを実行することができます。

Python では広く一般的に使用されているライブラリです。

試しに以下のコードを、普段使用しているエディタにコピペして実行してみて下さい。

これだけで下のような画面が作成できます。画面は「×」を押して閉じることができます。

作成した画面は実行ファイルに変換(exe化)して配布することも可能です。
実行ファイル作成方法についてはこちらの記事を参考にしてください
【Python】PyInstallerでPythonスクリプトをexe化

使用モジュール

tkinter は Python標準モジュールのためインストールは不要です。

ライブラリ :tkinter(公式ドキュメント
インストール:不要

tkinterの構造

tkinter では、GUI画面をツリー状の階層構造を構成するように作成します。
基本的な順序は ①Window作成 ②Frame設定・配置 ③Widget設定・配置 の順になります。ボタンやラベルなどのオブジェクトを Widget(ウィジェット)と呼び、Widget を入れる箱を Frame(フレーム)と呼びます。

FrameやWidgetの使い方については、別の記事で詳細に解説しています。
【Frame設定】
【Python tkinter】Frameの使い方

【Widget設定】
【Python/tkinter】Label(ラベル)の使い方
【Python/tkinter】Button(ボタン)の使い方
【Python/tkinter】Entry(エントリー)の使い方
【Python/tkinter】Canvas(キャンバス)の使い方

【配置】
【Python/tkinter】Widgetの配置(grid)
【Python/tkinter】Widgetの配置(pack)
【Python/tkinter】Widgetの配置(place)

上の画面を作成するコードは以下のようになっています。コードの解説は後述します。

サンプルコードを順に解説していきます。

モジュールのインポート

tkinter をインポートします。
import * とすることで、メソッド呼び出し時のオブジェクト名 Tk. を省略する事ができます。

Window作成

Tk() はクラス Tk のインスタンス(オブジェクト)を生成して返します。
この root が画面上のメインウィンドウに対応します。

メインウィンドウを作成した後に、ラベルやボタンなどのウィジェットを配置していきます。

最後に root.mainloop() でイベントループを開始して、ユーザーからの要求(イベント)を処理します。

Window設定

画面サイズ設定は geometory('横x縦') で指定します。
ピクセル単位で横・縦のサイズを指定して x(エックス)で区切ります。

デフォルトではウィンドウサイズは可変になっていますが resizable(Width=False, height=False) で固定に出来ます。引数は省略して resizable(False, False) または resizable(0,0) と記述出来ます。

Frame設定

下図のようなレイアウトで Frame を配置する設定を行います。
各フレームを格子状に配置するため grid で行列の位置を指定していきます。

Frame の詳細はこちらの記事を参照してください。
Python tkinter Frameの使い方

Frameスタイル設定

Frame のスタイルを設定します。
基本は Frame(Windowオブジェクト, width=横サイズ, height=縦サイズ) になります。

Frameサイズを固定 (propagate)

Frame は、デフォルトではボタンなどのWidgetに合わせてサイズを自動で縮小拡大します。
自動で変更されたくない場合は propagate(False) を指定してサイズを固定できます。

この例では Widget を pack で配置していますが、grid で配置する場合は grid_propagate(False) を使用してください。

Frameを配置 (grid)

先程定義した Frame を grid(row=行位置, column=列位置) で Window に配置します。

grid の詳細についてはこちらの記事で解説しています。
・関連記事:【Python/tkinter】Widgetの配置(grid)

Widget設定・配置

ラベルやボタンなどのWidgetを設定・配置していきます。

サンプルで使用しているgrid, pack の詳細についてはこちらの記事で解説しています。
・関連記事:【Python/tkinter】Widgetの配置(grid)
・関連記事:【Python/tkinter】Widgetの配置(pack)

grid, pack以外にもplaceで配置する方法もあります。
・関連記事:【Python/tkinter】Widgetの配置(place)

ラベル(Label)

Label(Frameオブジェクト, text=’ラベル文字列’, font=(‘フォント名’, サイズ), bg=’背景色’, fg=’文字色’)

frame1にラベルを配置していきます。


ポイントを解説します。

Label()でラベルのスタイルを設定します。
背景色は「16進数」もしくは「色名」で指定します。省略するとデフォルトの背景色無し、文字色黒になります。

設定したラベルを pack で配置します。
label_1a.pack() のように引数を省略すると、デフォルトの設定で中央配置・パディング(隙間)無しで設定されます。
padx, pady は外側の横・縦の隙間を指定、anchor は配置位置を指定しています。

ラベルについては以下の記事で詳しく解説しています。
・関連記事:【Python/tkinter】Label(ラベル)の使い方

ボタン(Button)

Button(Frameオブジェクト, text=”, command=動作させる関数) 

frame2の上側のボタンを配置します。
ボタンを押すと、ボタンのテキストが「クリックしました」に変わります。


引数 command にボタンの文字を変更する関数を指定しています。
関数は以下になります。(サンプルプログラム3~4行目)


ボタンについては以下の記事で詳しく解説しています。
・関連記事:【Python/tkinter】Button(ボタン)の使い方

テキストボックス(Entry)

Entry(Frameオブジェクト, width=幅のサイズ) 

frame2にテキストボックス・ボタン・ラベルを配置します。
テキストボックスにテキストを入力してボタンを押すと、下のラベルに文字列がコピーされます。


ポイントを解説します。

まずテキストボックスを Entry() で設定します。

テキストボックスの値を動的に取得するために、文字列を保持するWidget変数StringVar()を変数 textとして設定します。


次にボタンの設定を行います。

commandには、引数付き関数 text.set(entry_2b.get())を指定したいため、lambda関数を使用する必要があります。

entry_2b.get()でテキストボックスに入力された文字列を取得し、その文字列をtext.set()で変数 textに文字列を格納します。


最後に文字列を表示するラベルを設定します。

固定の文字列を表示するラベルでは引数textに文字列を指定しますが、動的に変化させたい場合は引数 textvariableにWidget変数を指定します。

これで、ボタンを押す→テキストボックスの文字列を取得→ラベルに文字列を表示 という流れができました。

Entryについては以下の記事で詳しく解説しています。
・関連記事:【Python/tkinter】Entry(エントリー)の使い方

チェックボタン(Checkbutton)

Checkbutton(Frameオブジェクト, text=選択肢文字列, variable=状態取得用変数)

frame3にチェックボックスを配置します。
合わせて選択状態を表示するためのボタンとラベルを配置します。


ポイントを解説します。

チェックボックスの状態設定用の変数を設定します。
選択状態を動的に取得するために、文字列を保持するWidget変数StringVarを、チェック数分の設定します。(chk_v1:オプション1用、chk_v2:オプション2用)

設定した変数の初期状態を設定します。
チェックボックスの状態値はデフォルトではチェックOFF:0、チェックON:1になります。
ここではオプション2を、未選択↔選択 となるように設定します。

変数の設定ができたらCheckbutton()で設定します。

チェックON/OFF時の値を変更するには引数onvalue=選択時文字列,offvalue=未選択時文字列を指定します。


ボタン、ラベルについては上述の解説を参考にしてください。
8.1 ラベル(Label)
8.2 ボタン(Button)

配置についてはこちらの記事を参考にしてください。
・関連記事:【Python/tkinter】Widgetの配置(grid)

ラジオボタン(Radiobutton)

Radiobutton(Frameオブジェクト, text=選択肢文字列, value=選択時設定値, variable=設定値格納変数)

frame4にラジオボタンを配置します。
合わせて選択状態を表示するためのボタンとラベルを配置します。


ポイントを解説します。

ラジオボタンの状態設定用の変数を設定します。
選択状態を動的に取得するために、文字列を保持するWidget変数StringVarオブジェクトをrad_vとして設定します。

LabelFrameというラベルとフレームがセットになったWidgetを設定します。
このWidgetは、グループ単位で一括処理を実行することができます。

このFrame内にラジオボタンの選択肢を配置させます。

Radiobutton()でラジオボタンをLabelFrame内のWidgetとして設定します。
選択時の値をvalueに設定、値を格納する変数をvariableに設定します。


ボタン、ラベルについては上述の解説を参考にしてください。
8.1 ラベル(Label)
8.2 ボタン(Button)

配置についてはこちらの記事を参考にしてください。
・関連記事:【Python/tkinter】Widgetの配置(grid)

スピンボックス(Spinbox)

Spinbox(Frameオブジェクト, state=状態, textvariable=Widget変数, values=選択肢リスト)


frame5にスピンリストと合わせて選択状態を表示するためのラベルを配置します。


ポイントを解説します。

選択状態を動的に取得するために、文字列を保持するWidget変数StringVarをspn_vとして設定し、
spn_v.set()でスピンボックスに表示する初期値を設定します。

Spinbox()でframe5に配置するWidgetとして設定します。
textvariableに、選択した値を格納するために文字列変数spn_vを指定します。

スピンボックスで選択した値を表示するラベルを設定します。
値は動的なのでtextvariableにWidget変数spn_vを設定しています。

配置についてはこちらの記事を参考にしてください。
・関連記事:【Python/tkinter】Widgetの配置(grid)

リストボックス(Listbox)

Listbox(Frameオブジェクト, listvariable=Widget変数, selectmode=選択モード, height=高さ)


frame6にリストボックス、選択値を表示させるボタンとラベルを配置します。


ポイントを解説します。

リストボックスに表示する選択肢をcountriesにリストで設定します。

リストボックス用のWidget変数としてlst_vをStringVarで設定します。引数valueに選択肢リストを指定するのがポイントです。

Listbox()をframe6のWidgetとして設定します。リスト表示文字列listvariableにWidget変数、項目選択方法を設定するselectmodeで複数選択モードの'multiple'を指定しています。

リスト選択値を取得するボタンを設定します。
commandに以下のselected関数を指定しています。(サンプルプログラム6~9行目)

listbox.cureselection()で選択された行番号をindices(タプル)として取得した後、文字列をlistbox.get(行番号)で取得、選択数分forで繰り返し、改行(’/n’)で結合しています。

配置についてはこちらの記事を参考にしてください。
【Python/tkinter】Widgetの配置(pack)

図形描画(Canvas)

frame7 に図形を描画するキャンバス、frame8に図形を描画・削除させるボタンを配置します。

キャンバスは Canvas(Frameオブジェクト, width=幅, height=高さ) で設定します。
ここでは、背景となる白のキャンバスも create_rectangle(横位置基準, 縦位置基準, 幅, 高さ) で作成しています。


次に Frame8 に描画と削除を実行するボタンを設定します。
create_rectangle() の引数 tag を設定しておくと、delete() でその tag を指定するだけで簡単に削除できます。

Canvasの使い方についてはこちらの記事で詳しく解説しています。
・関連記事:【Python/tkinter】Canvas(キャンバス)の使い方

画像表示(Photoimage)

frame9に画像を表示させます。

画像はPhotoImageで読み込み、ラベルのオプションimageで画像を指定することで表示できます。


配置についてはこちらの記事を参考にしてください。
【Python/tkinter】Widgetの配置(pack)


以上でプログラムの解説は終了です。


PythonでGUIアプリを作成できるモジュールtkinter(ティーキンター)の使い方を解説しました。
ぜひ活用して業務の効率化などにお役立てください。