自作や社内のアプリ・ツールの開発を行う際に「コマンドプロンプトでも実行できるが使いづらい」「市販アプリのようにウィンドウ操作ができるGUIアプリ・ツールにしたい」などと考えることが多いと思います。
そんな時には、Pythonライブラリの「tkinter」がおすすめです。「tkinter」を使えるようになれば、簡単にGUIアプリを作成することが可能になり、業務の効率化やコストの削減なども期待できるでしょう。
本記事では、「tkinter」でのGUIアプリ・ツールの作成方法について、初心者にもわかりやすく解説していきます。
目次
1.Python tkinterの概要
tkinterとは
tkinter(ティーケーインター)とは、「Pythonの公式が提供している標準搭載のGUIライブラリ」です。つまり、pipなどで追加のインストールを行わずに使用できるライブラリになっています。
tkinterでのGUIアプリ・ツール作成では以下のようなことが可能です。
ウィンドウ作成
ウィジェット(ボタンやラベル、テキストボックスなど)の追加と配置
ボタンなどの操作による動作(イベント処理)の設定
tkinterはマルチプラットフォーム対応で、Windows、Mac、Linuxなどの複数環境へ対応しています。
Python3 tkinterのインストールについて
tkinterはPython3に標準で搭載されているため、インストールの必要はなく、Pythonのインストールが正常にできていれば使用可能です。
tkinterの動作確認
正常に動作するかの確認方法は2種類で「import処理」と「基本動作」になります。
【import処理の確認】
ソースコードに以下の内容を含めて実行で確認可能です。
※Python対応のIDEやエディタツールでは実行しなくともエラーを表示してくれる場合があります。
import tkinter |
importが正常にできている場合には問題なく実行できますが、importができていない場合にはエラーが発生し、内容は以下の通りです。
No module named ‘tkinter’ |
【基本動作の確認】
コマンドプロンプトで以下のコマンドを実行することで確認ができます。
> python -m tkinter |
成功すれば、以下のようなウィンドウが表示されるため、その場合は問題なしです。
しかし、実行できなかった場合には以下のようなエラーが発生します。
No module named ‘tkinter’ |
tkinterが使えない(No module named 'tkinter')の対策
エラーが発生した場合は、以下のことを確認しましょう。
Python公式サイトで不具合発生状況の確認
対象のバージョンがサービス終了していないかの確認
Python3の再インストールして動作確認
これらの確認を行っても実行できない場合は公式に問い合わせを行ってください。
tkinter以外のGUIライブラリ
Pythonにはtkinter以外にもGUIライブラリがあるため、少しだけ紹介いたします。
PyQt
豊富なウィジェットを駆使した高いデザイン性を必要とするGUIアプリ・ツールの開発におすすめです。商用目的での利用ではライセンスに注意が必要になります。
WxPython
ネイティブな見た目と使い勝手を持つGUIアプリ・ツールを作成したい場合におすすめです。ウィジェットも多く、デザインの自由度も高いという魅力もあります。
Kivy
マルチタッチやマルチプラットフォーム対応でiOSやAndroidでも動くGUIアプリ・ツールを作成する場合におすすめです。高いパフォーマンスで柔軟なデザインもできます。
自由度の高いデザイン性と豊富な機能を持っておりますが、初心者にはシンプルな「tkinter」を学んでからが良いでしょう。
拡張モジュール「ttk」
tkinterにはttk(Theme Tkの略)という拡張モジュールがあります。
tkinterの標準モジュールに加え、tkinterよりもスタイリッシュなデザインのウィジェットが使用可能です。テーマ機能を使用すれば、間単に各要素のデザイン変更もできます。
tkinterよりも機能が追加された分、処理速度の低下やメモリ使用量の増加という欠点はありますが、デザインにこだわるなら利用も検討して良いでしょう。
2.そもそもGUIアプリ・ツールとは
GUIとは
GUI(Graphical User Interface)とは、「コンピュータやアプリなどを操作するための視覚的なインターフェース」です。
画面内の画像、アイコン、ラベル、ボタンなどで操作を行うことができ、コマンドプロンプトなどのテキストベースでの操作が基本のインターフェース(CLI:Command Line Interface)に比べて、GUIは直感的に操作できることが魅力です。
GUIのメリット3つ
GUIのメリットは主に以下の3つになります。
操作性の向上
処理状況の可視化
アプリ・ツールの利便性向上
それぞれ詳しく見ていきましょう。
操作性の向上
前述の通り、GUIには画面があるため、コマンドプロンプトなどには必要なコマンドラインの知識を必要としません。
ボタン、ラベル、テキストボックスなどの視覚的な要素により、コマンドでは複雑な操作もシンプルに実行することが可能です。
処理状況の可視化
コマンドプロンプトではコマンドの実行結果がテキストベースなのに対して、GUIではグラフでの表示や画面の遷移、新規ウィンドウの表示など処理の結果や状況を表示することができます。
データ入力やエラーなどの効率化も期待できるでしょう。
アプリ・ツールの利便性向上
テキストベースのインターフェースを使用するアプリ・ツールでは「実行方法」「実行結果」「エラー時の対応」などの操作に関する説明が複雑になりがちです。一方、GUIアプリ・ツールであれば、視覚的な要素により複数の操作を迅速に効率よく行えるように設計することができます。
GUIのウィジェットとは
GUIアプリ・ツールの作成において欠かせない要素が「ウィジェット」です。
ウィジェットとは、「GUIを構成する基本的な部品」を指します。
具体的には以下のようなものです。
ボタン
ラベル
テキストボックス
チェックボックス
ドロップダウン
ラジオボタン など
GUIでは画面にこれらの要素をどのように組み合わせて、どのように配置するかが重要になります。
本記事では構成や設計のノウハウについては詳しくは触れませんので、興味がある場合は調べてみると良いでしょう。
関連記事
【Python初心者向け】Pythonで作れるものや入門用のサンプルコード、おすすめの参考書を紹介!
3.tkinterのメリット・デメリット
メリット
tkinterのメリットは以下のようなものがあります。
構文がシンプル
tkinterはシンプルでわかりやすい構文が特徴です。Python初心者でも基本的なウィジェットやレイアウト管理が簡単に行えるため、短時間でGUIアプリ・ツールの作成ができます。
動作が軽く、処理が速い
tkinterは動作が軽く、処理速度が速いのも特徴です。リソースが限られた環境でのシンプルなGUIアプリ・ツールの開発においては高いパフォーマンスを発揮できます。
マルチプラットフォーム対応
前述にもあるようにWindows、Mac、Linuxといったよく利用されるプラットフォームに対応可能です。そのため、別環境で作成したプログラムであっても、再利用することができます。
デメリット
tkinterのデメリットは以下の通りです。
複雑なレイアウトの構築が難しい
tkinterはグリッド状にウィジェットを配置するなどのシンプルなレイアウトを作成するのにはおすすめです。しかし、複雑なレイアウトを実現するにはコードが冗長になり、可読性やメンテナンス性が損なわれる可能性があります。
更新頻度が低い
tkinterはPythonの標準ライブラリであるため、Pythonのリリースでしか更新されません。そのため、他のGUIライブラリよりも機能の追加や改善が行われる回数は低くなるのが欠点です。
関連記事
Pythonを学習するメリットとは?デメリットや向き不向き、将来性などわかりやすく解説
4.tkinterチュートリアル
前述にもある通りインストールは必要ありません。そのため、インポートを行えばすぐに利用可能です。
tkinterの基本となるソースコードは以下のようになります。
例)
# ライブラリのインポート import tkinter as tk
root = tk.Tk() root.title("test") root.geometry("300x200")
label = tk.Label(root, text="テキストテキスト") label.pack()
root.mainloop() |
それでは1つずつ見ていきましょう。
ここで行っているのがライブラリのインポートです。「as句」を使用すると指定した名称でコードが記載できるようになります。
例で行っているのは「tkinter」では長いため、「tk」という略称で扱える設定です。
# ライブラリのインポート import tkinter as tk |
ここではGUIアプリ・ツールのメインウィンドウの設定をしている箇所で各行で以下のような処理をしております。
1行目:アプリ・ツールのメインウィンドウの作成
2行目:ウィンドウに表示されるタイトルの設定
3行目:ウィンドウのサイズ設定
# tkオブジェクトの作成 root = tk.Tk() root.title("test") root.geometry("300x200") |
ここで行っているのはウィジェットの追加とレイアウトです。
例ではラベルの設定とラベルの配置を行っております。
# ウィジェットの配置や、イベント処理などを記述 label = tk.Label(root, text="テキストテキスト") label.pack() |
ここではウィンドウの表示とイベント処理の待機ができるようにする処理です。
# メインループの実行 root.mainloop() |
詳しい機能については次章から紹介していきます。
5.メイン画面(root)の操作
ここではメインウィンドウに関する処理を見ていきましょう。
タイトル設定(root.title)
ウィンドウのタイトル設定を行うメソッドです。
設定したタイトルはウィンドウの左上に表示されます。
root.title(“任意のタイトルを設定") |
ウィンドウサイズ設定(root.geometry)
ウィンドウのサイズと基準位置を設定するメソッドです。
以下の例では幅800、高さ600、ウィンドウの左上角を座標(0, 0)としてウィジェット配置の基準位置を座標(100,100)設定しています。
root.geometry("800x600+100+100") |
ウィンドウサイズ変更 可否(root.resizable)
ウィンドウサイズの幅と高さを可変にするかの設定するメソッドです。
設定は真偽値(True、 False)で設定し、以下の例では幅の可変、高さを固定に設定しています。
root.resizable(True, False) |
ウィンドウ最大サイズ設定(root.maxsize)
ウィンドウの最大サイズを設定するメソッドです。
主にアプリ・ツールを使用する画面より大きくならないことを避けるために使用し、以下の例では幅1000、高さ700以上にはならないように設定しています。
root.maxsize(1000, 700) |
ウィンドウ最小サイズ設定(root.minsize)
ウィンドウの最小サイズを設定するメソッドです。
主にウィンドウの表示崩れが起きないようにするために使用し、以下の例では幅240、高さ160以下にはならないように設定しています。
root.minsize(240, 160) |
ウィンドウ属性設定(root.configure)
ウィンドウの属性を一括で設定できるメソッドです。
設定できる属性には背景色やサイズ、タイトルなどの前述の処理で行っていた設定もできます。以下の例は背景色を黒にする設定です。
root.configure(bg="black") |
イベントループ開始(root.mainloop)
これはウィンドウを表示し続け、ユーザーの操作を待機するために使用するメソッドになります。これがないと画面を表示し、操作されるまで維持することができないため注意が必要です。
# メインループの実行 root.mainloop() |
関連記事
Pythonインストール方法(Mac・Linux・Windows)ダウンロードから実行方法まで解説
Pythonとは?コードの具体例など人気プログラミング言語を初心者にわかりやすく解説
6.ウィジェットのレイアウト方法
tkinterにはレイアウトマネージャーが存在し、それを使用することでウィジェットの配置を行っていきます。
主に使用されるのは以下の3つになります。
pack:ソースコードの記載順にウィジェット配置
grid:行と列を指定したウィジェット配置
place:座標を指定したウィジェット配置
それぞれ詳しく見ていきましょう。
pack:ソースコードの記載順にウィジェット配置
packは、記載順にウィジェットを順番に配置するシンプルなレイアウトマネージャで、ウィジェットを上下または左右に配置する際におすすめです。
以下のオプションを使用して配置を設定していきます
引数 | 内容 |
---|---|
side | ウィジェットの配置の指定を「TOP(上)、BOTTOM(下)、LEFT(左)、 RIGHT(右)」から選択 |
fill | ウィジェットが余白をどう埋めるかを「X(幅方向埋め)、Y(高さ方向埋め)、BOTH(両方向埋め)、 NONE(指定なし)」から選択 |
expand | ウィジェットが利用可能な残りの領域全体に広げるかどうかを真偽値「True(分配する)、 False(分配しない)」で指定 |
例)
# ライブラリのインポート import tkinter as tk
root = tk.Tk() root.title("packテスト") root.geometry("300x200")
btn1 = tk.Button(root, text="Button 1") btn1.pack(side=tk.TOP, fill=tk.X)
btn2 = tk.Button(root, text="Button 2") btn2.pack(side=tk.LEFT, fill=tk.Y)
btn3 = tk.Button(root, text="Button 3") btn3.pack(side=tk.RIGHT, expand=True)
root.mainloop() |
grid:行と列を指定したウィジェット配置
gridは、ウィジェットを行と列の形式で配置するレイアウトマネージャで、ウィジェットの複雑なレイアウトを簡単に設定できるのでおすすめです。
以下のオプションを使用して配置を設定していきます。
引数 | 内容 |
---|---|
row | ウィジェットを配置する行の指定 |
column | ウィジェットを配置する列の指定 |
rowspan | ウィジェットがまたがる行数の指定 |
columnspan | ウィジェットがまたがる列数の指定 |
sticky | ウィジェットをセル内でどの方向に引き伸ばすかを「N(北), E(東), S(南), W(西)」またはこれらの組み合わせ(例:NS(南北), EW(東西))で指定 |
例)
# ライブラリのインポート import tkinter as tk
root = tk.Tk() root.title("gridテスト") root.geometry("300x200")
label1 = tk.Label(root, text="Label 1") label1.grid(row=0, column=0)
label2 = tk.Label(root, text="Label 2") label2.grid(row=0, column=1)
button1 = tk.Button(root, text="Button 1") button1.grid(row=1, column=0)
button2 = tk.Button(root, text="Button 2") button2.grid(row=1, column=1)
button3 = tk.Button(root, text="Button 3") button3.grid(row=2, column=0, columnspan=2)
button4 = tk.Button(root, text="Button 4") button4.grid(row=3, column=0, columnspan=2, sticky=tk.W+tk.E)
root.mainloop() |
place:座標を指定したウィジェット配置
placeは、ウィジェットを座標を使用して正確に配置するレイアウトマネージャで、絶対位置や相対位置でレイアウトする際におすすめです。
以下のオプションを使用して配置を設定していきます。
引数 | 内容 |
---|---|
x・y | ウィジェットを配置する絶対座標を指定 |
relx・rely | ウィジェットを配置する相対座標を指定(0.0(xは左端、yは最上)から1.0(xは右端、yは最下)の範囲) |
width・height | ウィジェットの幅と高さを指定 |
relwidth・relheight | ウィジェットの相対的な幅と高さを指定(0.0(最小)から1.0(最大)の範囲) |
例)
# ライブラリのインポート import tkinter as tk
root = tk.Tk() root.title("placeテスト") root.geometry("300x200")
label1 = tk.Label(root, text="Label") label1.place(x=50, y=50)
label2 = tk.Button(root, text="Button") label2.place(x=150, y=50, width=50, height=10)
button1 = tk.Button(root, text="Button") button1.place(relx=0.5, rely=0.5)
button2 = tk.Button(root, text="Button") button2.place(relx=0.5, rely=1.0, relwidth=0.5, relheight=0.5)
root.mainloop() |
7.tkinterでよく使用される10個のウィジェット
①Label(ラベル):テキスト表示
Labelウィジェットは、文字や画像といった基本的に変化のない静的な情報を表示するために使用されるウィジェットです。
以下の引数を指定して表示内容を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
text | 表示テキスト |
font | テキストのフォント(例: ("Arial", 16)) |
bg | 背景色 |
fg | テキスト色 |
例)以下の設定で表示する場合の例です。
親ウィジェット:メインウィンドウ
表示テキスト:テストテキスト
フォント:Arialのサイズ16
背景色:黄色
テキスト色:青
label = tk.Label(root, text="テストテキスト", font=("Arial", 16), bg="yellow", fg="blue") label.pack() |
②Button(ボタン):ボタン表示
Buttonウィジェットは、その名の通りクリック可能なボタンを作成できるウィジェットになります。クリック時のアクション(処理)を設定することも可能です。
以下の引数を指定してボタンの表示形式とクリック時のアクションを設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
text | 表示テキスト |
command | クリック時に実行される関数 |
bg | ボタンの背景色 |
fg | 表示テキストの色 |
例)以下の設定で表示する場合の例です。
親ウィジェット:メインウィンドウ
表示テキスト:クリック
クリック時のアクション:button_click_actionメソッド
背景色:緑
テキスト色:白
def button_click_action(): print("Click Button")
button.pack() |
③Entry(エントリー):改行なしテキストボックス
Entryウィジェットは、シングルライン(改行なし)のテキスト入力ができるウィジェットです。
以下の引数を指定してエントリーと入力時の表示を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
show | 入力テキストを隠す際の文字(例: show="*") |
width | エントリーの幅 |
font | 入力テキストのフォント |
例)以下の設定で表示する場合の例です。
親ウィジェット:メインウィンドウ
エントリーの幅:30
フォント:Arialのサイズ14
entry = tk.Entry(root, width=30, font=("Arial", 14)) entry.pack() |
④Text(テキスト):改行ありテキストフィールド
Textウィジェットは、マルチライン(改行あり)のテキスト入力ができるウィジェットです。
以下の引数を指定してテキストと入力時の表示を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
height | テキストフィールドの高さ(行数) |
width | テキストフィールドの幅(文字数) |
font | 入力テキストのフォント |
例)以下の設定で表示する場合の例です。
親ウィジェット:メインウィンドウ
テキストフィールドの高さ:10行
テキストフィールドの幅:40文字
フォント:Arialのサイズ14
text = tk.Text(root, height=10, width=40, font=("Arial", 14)) text.pack() |
⑤CheckButton(チェックボタン):複数選択可のチェックボックス
CheckButtonウィジェットは、オンオフの状態を持ち、主に複数選択可能な選択肢を用意する際に使用するウィジェットです。
以下の引数を指定してチェックボタンの表示と値の管理を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
text | 表示テキスト |
variable | オンオフの状態を保持するための変数(通常はtk.IntVar) |
onvalue | チェックされたときに変数に設定される値(デフォルト:1) |
offvalue | チェックされていない、またはチェックが外れたときに変数に設定される値(デフォルト:0) |
例)以下の設定で表示する場合の例です。
3つのチェックボタンを用意
オンオフ状態を保持する変数をチェックボタンと同じ数だけ用意
親ウィジェット:メインウィンドウ
テキスト:チェック1、チェック2、チェック3
オンオフ状態を保持する変数:用意した変数をそれぞれ設定
チェックオン時の設定値:1(デフォルト)
チェックオフ時の設定値:0(デフォルト)
# チェックボタンのオンオフ状態を保持するための変数を作成 var1 = tk.BooleanVar() var2 = tk.BooleanVar() var3 = tk.BooleanVar()
checkbox1 = tk.Checkbutton(root, text="チェック 1", variable=var1) checkbox2 = tk.Checkbutton(root, text="チェック 2", variable=var2) checkbox3 = tk.Checkbutton(root, text="チェック 3", variable=var3)
checkbox1.pack() checkbox2.pack() checkbox3.pack() |
⑥Radiobutton(ラジオボタン):1つだけ選べるボックス
Radiobuttonウィジェットは、オンオフの状態を持ち、主に複数選択肢から1つを選択できるようにする際に使用するウィジェットです。
以下の引数を指定してラジオボタンの表示と値の管理を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
text | 表示テキスト |
variable | オンオフの状態を保持するための変数(通常はtk.IntVarまたはtk.StringVar) |
value | オン時に変数へ設定する値 |
例)以下の設定で表示する場合の例です。
3つのラジオボタンを用意
オンオフ状態を保持する変数を1つ用意
親ウィジェット:メインウィンドウ
テキスト:ラジオボタン 1、ラジオボタン 2、ラジオボタン 3
オンオフ状態を保持する変数:用意した1つの変数をすべてに設定
オン時の設定値:ラジオボタン 1→1、ラジオボタン 2→2、ラジオボタン 3→3
# ラジオボタンのオンオフ状態を管理するための変数を作成 var = tk.StringVar(value="1") # 初期値を設定
radiobutton1 = tk.Radiobutton(root, text="ラジオボタン 1", variable=var, value="1") radiobutton2 = tk.Radiobutton(root, text="ラジオボタン 2", variable=var, value="2") radiobutton3 = tk.Radiobutton(root, text="ラジオボタン 3", variable=var, value="3")
radiobutton1.pack() radiobutton2.pack() radiobutton3.pack() |
⑦Scale(スケール):スライダー表示
Scaleウィジェットは値の選択ができるスライダーが必要な際に使用するウィジェットです。
以下の引数を指定してスケールの表示と値の管理を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
from_ | スケールの最小値 |
to | スケールの最大値 |
orient | : スケールの移動方向(tk.HORIZONTAL(左右)またはtk.VERTICAL(上下)) |
variable | スケールの値を保持する変数(通常はtk.IntVarまたはtk.DoubleVar) |
例)以下の設定で表示する場合の例です。
スケールの値を保持する変数を用意
親ウィジェット:メインウィンドウ
最小値:0
最大値:100
移動方向:左右
スケールの値を保持する変数:用意した変数を設定
var = tk.IntVar()
scale.pack() |
⑧Frame(フレーム):ウィジェットのグループ化
Frameウィジェットは、他のウィジェットをグループ化しレイアウト整理する役割を持つウィジェットです。
以下の引数を指定してフレームの表示内容を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
bg | フレームの背景色 |
width | フレーム幅 |
height | フレーム高さ |
例)以下の設定で表示する場合の例です。
フレーム内(1つ)とフレーム外(2つ)に設定するラベルウィジェットを用意
親ウィジェット:メインウィンドウ
背景色:ライトブルー
幅:グループ化するラベルの幅に依存
高さ:グループ化するラベルの高さに依存
label = tk.Label(root, text="フレーム外ラベル") label.pack()
frame = tk.Frame(root, bg='lightblue') frame.pack(padx=10, pady=10)
label1 = tk.Label(frame, text="フレーム内ラベル 1") label1.pack(padx=5,pady=5)
label2.pack(padx=5,pady=5) |
⑨Canvas(キャンバス):画像表示
Canvasウィジェットは、図形や画像を自由に描画できる領域を作成するウィジェットです。
以下の引数を指定してキャンバスの表示内容を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
bg | キャンバスの背景色 |
width | キャンバス幅 |
height | キャンバス高さ |
例)以下の設定で表示する場合の例です。
親ウィジェット:メインウィンドウ
背景色:白
幅:300
高さ:200
青の線を描画
赤の矩形を描画
canvas = tk.Canvas(root, width=300, height=200, bg="white") canvas.pack()
canvas.create_line(0, 0, 300, 200, fill="blue")
canvas.create_rectangle(50, 50, 250, 150, outline="red", width=2) |
⑩Menu(メニュー):ウィンドウにメニュー追加
Menuウィジェットは、ウィンドウにメニューバーの追加ができるウィジェットです。
以下の引数を指定してキャンバスの表示内容を設定します。
引数 | 内容 |
---|---|
master | 親ウィジェット |
bg | 背景色 |
fg | テキスト色 |
font | メニューテキストのフォント |
postcommand | メニュー表示前の実行関数 |
tearoff | True、Falseで指定 True設定で、メニューをウィンドウから独立したウィンドウとして生成(デフォルトはTrue) |
メニュー項目を細かく設定するために使用するメソッドは以下の通りです。
add_command():通常のメニュー項目追加
add_separator():メニューに区切り追加
add_cascade():サブメニュー追加
add_checkbutton():チェックボタン追加
add_radiobutton():ラジオボタン追加
例)以下の設定で表示する場合の例です。
メインウィンドウでメニューバーを生成
生成したメニューバーを親として、独立したメニューウィンドウの要素を生成
メニューウィンドウの項目に「新規」「開く」「保存」を追加
メニューウィンドウに区切り線を追加
メニューウィンドウの項目に「終了」を追加
メニューバーに「ファイル」という名称でメニューウィンドウを設定
メインウィンドウにメニューバーを設定
def menu_command(): print("メニューが選択されました")
filemenu = tk.Menu(menubar, tearoff=True) filemenu.add_command(label="新規", command=menu_command) filemenu.add_command(label="開く", command=menu_command) filemenu.add_command(label="保存", command=menu_command) filemenu.add_separator() filemenu.add_command(label="終了", command=root.quit) menubar.add_cascade(label="ファイル", menu=filemenu)
|
関連記事
Pythonライブラリとは?使い方や調べ方、おすすめのライブラリなどわかりやすく解説
8.イベント処理の方法
tkinterのイベント処理
tkinterでは、ユーザーの操作によってアプリ・ツールの処理を制御するためにイベント処理を用意します。
イベント処理は、特定のイベント(クリックやフォーカスなど)に関数を紐づける「イベントバインディング」で設定が可能です。
tkinterでは以下のようにウィジェットのbindメソッドで設定を行います。
widget.bind(event, handler) |
項目 | 内容 |
---|---|
widget | イベントをバインドしたいウィジェット |
event | 対象のウィジェットにバインドするイベント(例:"<Button-1>"、"<KeyPress-a>") |
handler | イベント発生で実行される関数(イベントハンドラ) |
例えば、ボタンクリックでのイベント処理は以下の通りです。
def button_clicked(event): label["text"] = "ボタンがクリックされました!"
label.pack()
button.pack()
|
このイベントではボタンがクリックされた際にラベルの表示を変更する処理を行っています。
【補足】
def button_clicked(event): label["text"] = "ボタンがクリックされました!" |
上記のようにイベントハンドラに設定する関数には引数にeventを設定することが必要です。
このeventには以下のような情報が含まれています。
取得方法 | 内容 |
---|---|
event.type | 発生したイベントの種類(例:ButtonPress、KeyPress) |
event.widget | イベントが発生したウィジェット |
event.x, event.y | イベントが発生したウィジェットの相対座標 |
event.x_root, event.y_root | イベントが発生したスクリーンの絶対座標 |
event.char | 押下されたキー文字 ※KeyPressイベントの場合 |
event.keysym | 押下されたキーシンボル(例:"a", "Shift_L") ※KeyPressイベントの場合 |
tkinterのイベントの種類
割り当てることができるイベントの種類は以下の通りです。
マウスイベント:クリック、移動、スクロールなど
キーボードイベント:キーの押下、キーの解放、特殊キーの押下など
フォーカスイベント:対象ウィジェットにフォーカスしたり、フォーカスが外れたりすること
その他:ウィンドウのサイズ変更、ウィンドウのクローズなど
それぞれ詳しく見ていきましょう
マウスイベント
イベント名 | 内容 |
---|---|
<Button-1> | マウスの左クリック |
<Button-2> | マウスの中ボタンクリック |
<Button-3> | マウスの右クリック |
<Double-Button-1> | マウスの左ボタンダブルクリック |
<Motion> | マウスが動いたとき |
<Enter> | マウスがウィジェットに入ったとき |
<Leave> | マウスがウィジェットから出たとき |
キーボードイベント
イベント名 | 内容 |
---|---|
<KeyPress> | 任意のキーを押下 |
<KeyRelease> | 任意のキーから離された |
<KeyPress-a> | "a"キーを押下 |
<KeyRelease-a> | "a"キーから離された |
フォーカスイベント
イベント名 | 内容 |
---|---|
<FocusIn> | ウィジェットにフォーカスする |
<FocusOut> | ウィジェットからフォーカスを外す |
その他
イベント名 | 内容 |
---|---|
<Destroy> | ウィンドウを閉じる |
<Configure> | ウィジェットやウィンドウのサイズ変更 |
9.ダイアログの使い方
tkinterでは、メッセージやファイルなどを表示するためのダイアログが用意されております。
本章ではその中からよく使用される以下の2つについて見ていきましょう。
メッセージボックス
ファイルダイアログ
メッセージボックス
メッセージボックスは、メッセージや確認、エラー、警告などの簡単な操作や確認を行う際に使用されるダイアログです。
使用する際は以下のようにインポートを行います
from tkinter import messagebox |
使用できるメッセージボックスは以下の通りです。
messagebox.askokcancel():はい/いいえの確認を行うためのダイアログ
messagebox.askquestion():質問用のダイアログ
messagebox.askyesno():はい/いいえの選択を行うためのダイアログ
messagebox.showerror():エラーメッセージを表示するためのダイアログ
messagebox.showinfo():通常のインフォメーションダイアログ
messagebox.showwarning():警告メッセージを表示するためのダイアログ
messagebox.askretrycancel():retry/cancelの確認を行うためのボックス
各関数での引数は以下の通りです。
引数 | 内容 |
---|---|
title | ダイアログのタイトル |
message | 表示するメッセージ |
**options | その他 代表例: title:ダイアログのタイトルバーに表示されるテキストの設定 parent:ダイアログとウィンドウとの関連付け geometry:ピクセル単位でのダイアログサイズと位置の指定 resizable:ダイアログサイズの「可変・不変」の設定 wraplength:メッセージの折り返しまでの文字数指定 |
例)以下の例は確認ボックスを使用して処理を行っています。
処理内容:確認ボックスでOKが選択された場合「OK」、キャンセルが選択された際に「NG」を表示
from tkinter import messagebox
result = messagebox.askokcancel("確認", "この操作を実行しますか?") if result: print("OK") else: print("NG")
button.pack() |
ファイルダイアログ
ファイルダイアログは、ユーザーにファイルを選択してもらい、開いたり、保存したりする際に使用されるダイアログです。
使用する際は以下のようにインポートを行います
from tkinter import filedialog |
使用できるファイルダイアログは以下の通りです。
filedialog.askopenfilename():ファイルオープン用ダイアログ
filedialog.askopenfilenames():複数ファイルオープン用ダイアログ
filedialog.asksaveasfilename():ファイルセーブ用ダイアログ
filedialog.askdirectory():フォルダ選択用ダイアログ
各関数での引数は以下の通りです。
引数 | 内容 |
---|---|
title | ダイアログのタイトル |
filetypes | 選択するファイルタイプの設定(例:[("テキストファイル", "*.txt")]) |
例)以下の例はファイルを開くダイアログを使用してテキストファイルの内容を表示する処理を行っています。
import tkinter.filedialog as filedialog
filename = filedialog.askopenfilename(title="ファイルを開く", filetypes=[("テキストファイル", "*.txt")]) if filename: with open(filename, "r") as f: text = f.read() print(text)
button.pack() |
10.まとめ
ここまでPythonのGUIライブラリ「tkinter」の使用方法について紹介してきました。
自作や社内のシンプルなGUIアプリ・ツールを作成する際にはおすすめです。うまく使いこなすことができれば、今までコマンドプロンプトなどのテキストベースで行っていた作業もGUIアプリ・ツールに置き換えて、作業の効率化を図れるでしょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。