本ページには PR が含まれます。
この記事ではPythonでデスクトップアプリを作成する方法を詳しくご紹介します。
サンプルコードと開発過程の画像を使って分かりやすく解説しているので、ぜひ参考にしてみてください。
また、Pythonでデスクトップアプリ(GUIアプリ)を開発できると、副業としてツール開発の案件もこなせるようになります。
ぜひこの機会にデスクトップアプリ開発をマスターしてみましょう!!
Pythonで使えるGUI開発ライブラリは主に以下の4つ
- tkinter
- kivy
- PyQt
- wxPython
今回はtkinterライブラリを扱います。tkinterライブラリを採用する理由は以下の通りです。
- Pythonの標準ライブラリだからインストール作業不要
- ネット上に開発の参考になる記事が豊富
- GUIアプリの動作が安定している
- Windows & macOSの両方に対応
ではさっそく、tkinterライブラリのデスクトップ開発の方法を見ていきましょう。
アプリ画面の作成
まずは、もっともシンプルなGUI画面を作ります。以下のサンプルコードをコピペして実行してみましょう。
# tkinterライブラリをインポート
import tkinter as tk
# GUI画面のメインフレームを作成(Tkinterインスタンス生成)
root = tk.Tk()
# GUIウィンドウタイトルを指定
root.title("sample GUI app")
# ウィンドウサイズを指定(横 × 縦)のピクセル値
root.geometry("360x240")
# GUIウィンドウを表示して待機させ続ける
root.mainloop()
この構文は、tkinterライブラリでGUIを生成するときは必ず書くと思っておいてOKです。
実行すると以下のようなGUIウィンドウが表示されます。(ウィンドウサイズやタイトルテキストを好きに変えてみてくださいね)


この状態だと、ちょっと味気ないですね…。
テキストラベルを表示
GUI画面にテキストラベルを表示させてみましょう。
ラベルテキストを表示するには下記のメソッドを使用します。
tk.Label(親ウィジェット, text=ラベルテキスト)
tk.Label()メソッドには他にも指定できるオプション引数があります。
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# ラベルの表示
label = tk.Label(root, text="GUIアプリ画面")
# 上下に余白をとって描画
label.pack(pady=10)
root.mainloop()


GUI画面の真ん中にラベルテキストが表示されていますね。
まだまだアプリとは呼べない画面です…。笑
ボタンを配置
GUI画面にボタンを配置します。
ボタンを作成するには下記のメソッドを使用します。
tk.Button(親ウィジェット, text=ボタン上のテキスト, command=ボタン押下時の処理)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=10)
# ボタンを作成 & 設置
button = tk.Button(root, text="Let's Python!!", command=None)
button.pack()
root.mainloop()


GUI画面の下部にボタンが表示されていますね。
今回はボタンを押しても何も起きない状態です。(引数command=None
)
テキスト入力ボックスを配置
今度はテキスト入力できる入力欄を配置してみましょう。
テキスト入力ボックスを作成するには下記のメソッドを使用します。
tk.Entry(親ウィジェット)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=10)
button = tk.Button(root, text="Let's Python!!")
button.pack()
# テキスト入力ボックスの作成 & 設置
input_box = tk.Entry(root)
input_box.pack()
root.mainloop()


キーボード入力を受け付けるボックスを作成することができます。
すこしアプリっぽくなってきましたね。
このウィジェットで受け付けられるテキスト入力は1行だけです。
複数行のテキスト入力ボックス
複数行の文字列を入力する場合は下記のメソッドを使用します。
tk.Text(親ウィジェット)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=10)
# 複数行のテキスト入力ボックスを作成&設置
textarea = tk.Text(root)
textarea.pack()
root.mainloop()


テキストリストを配置
GUIにテキストリストを表示してみます。
テキストリストに表示する文字列をあらかじめ専用のオブジェクトに格納する必要があります。
data = tk.StringVar(value=["tkinter", "kivy", "PyQt", "wxPython"])
用意したStringVarオブジェクトを使用して、下記のメソッドでテキストリストを作成します。
tk.Listbox(親ウィジェット, listvariable=tk.StringVarオブジェクト)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=20)
# テキストリストの作成&設置
data = tk.StringVar(value=["tkinter", "kivy", "PyQt", "wxPython"])
textlist = tk.Listbox(root, listvariable=data)
textlist.pack()
root.mainloop()


テキストリストを用いて文字列を選択肢として扱うことができます。
プルダウンメニューを配置
GUI画面にプルダウンメニューを配置してみましょう。
プルダウンメニューを作成するには、新たにttkモジュールをインポートする必要があります。
import tkinter.ttk as ttk
使用するメソッドは下記の通りです。
ttk.Combobox(親ウィジェット, values=選択肢の配列)
import tkinter as tk
# ttkモジュールをインポート
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=10)
button = tk.Button(root, text="Let's Python!!")
button.pack()
input_box = tk.Entry(root)
input_box.pack(pady=5)
# プルダウンメニューを配置
combobox = ttk.Combobox(root, values=["Windows", "macOS", "iOS", "Android", "Linux", "Ubuntu"])
combobox.pack()
root.mainloop()


プルダウンメニューの選択肢も自由に設定できるのでとても便利です。
ユーザインタフェースとしてもだいぶアプリらしくなってきましたね。
ラジオボタンの配置
GUIにラジオボタンを配置するには下記のメソッドを使用します。
tk.Radiobutton(親ウィジェット, text=選択肢の文字列, value=選択肢のインデックス)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=10)
button = tk.Button(root, text="Let's Python!!")
button.pack()
input_box = tk.Entry(root)
input_box.pack(pady=5)
combobox = ttk.Combobox(root, values=["Windows", "macOS", "iOS", "Android", "Linux", "Ubuntu"])
combobox.pack()
# ラジオボタンの作成&設置
radiobutton0 = tk.Radiobutton(root, text="tkinter", value=0)
radiobutton1 = tk.Radiobutton(root, text="kivy", value=1)
radiobutton2 = tk.Radiobutton(root, text="PyQt", value=2)
radiobutton3 = tk.Radiobutton(root, text="wxPython", value=3)
radiobutton0.pack()
radiobutton1.pack()
radiobutton2.pack()
radiobutton3.pack()
root.mainloop()


ラジオボタンなら一目で選択肢がわかるので便利ですね。
プルダウンメニューと同様、選択肢から一つだけ選べるようになっています。
複数の選択肢を選びたいはチェックボックスを使いましょう。
チェックボックスの配置
GUIにチェックボックスを配置するには下記のメソッドを使用します。
tk.Checkbutton(親ウィジェット, text=選択肢の文字列)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=20)
# チェックボックスの作成&設置
checkbox0 = tk.Checkbutton(root, text="tkinter")
checkbox1 = tk.Checkbutton(root, text="kivy")
checkbox2 = tk.Checkbutton(root, text="PyQt")
checkbox3 = tk.Checkbutton(root, text="wxPython")
checkbox0.pack()
checkbox1.pack()
checkbox2.pack()
checkbox3.pack()
root.mainloop()


チェックボックスを利用することで同時に複数の選択肢を選べます。
メッセージダイアログを表示
GUIにダイアログを表示させてみます。
表示できるダイアログには以下の種類があります。
- 通常メッセージ
- 警告メッセージ
- エラーメッセージ
- 再試行ダイアログ
- Yes/No選択ダイアログ
- キャンセルダイアログ
ここでは、Yes/No選択ダイアログを表示してみます。
メッセージダイアログを表示するにはmessageboxモジュールをインポートします。
from tkinter import messagebox
Yes/No選択ダイアログを表示するには下記のメソッドを使用します。
messagebox.askyesno(title=ウィンドウのタイトル, text=表示メッセージ)
import tkinter as tk
from tkinter import messagebox
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=20)
# Yes/No選択ダイアログの作成&表示
yesno_dialog = messagebox.askyesno(title="確認画面", message="処理を続けますか??")
root.mainloop()


ポップアップで選択できればユーザにとって、操作がわかりやすいですよね。
macOSではダイアログウィンドウにタイトルが表示されません。
スクロールバーの配置
GUIにスクロールバーを表示させてみましょう。
スクロールバーを作成するには下記のメソッドを使用します。
tk.Scrollbar(親ウィンドウ, orient=スクロール方向(縦or横), command=対象ウィジェットと縦or横)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# メインフレームの作成&設置
main_frame = tk.Frame(root)
main_frame.pack(pady=20)
data = tk.StringVar(value=["tkinter", "kivy", "PyQt", "wxPython"]*10)
textlist = tk.Listbox(main_frame, listvariable=data)
textlist.grid(row=0, column=0)
# スクロールバーの作成&反映&設置
scrollbar = tk.Scrollbar(main_frame, orient=tk.VERTICAL, command=textlist.yview)
textlist["yscrollcommand"] = scrollbar.set
scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S))
root.mainloop()


今回の例ではテキストリストを縦スクロールできるスクロールバーを設置してみました。
スクロールバーを使えば大量のテキスト情報でも画面に表示できるので便利ですね。
ラベル付きフレームの作成
ラベル付きフレームを作成するには下記のメソッドを使用します。
tk.LabelFrame(親ウィンドウ, text=ラベルテキスト)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# ラベル付きフレームの作成&設置
labelframe = tk.LabelFrame(root, text="自由入力欄")
labelframe.pack(pady=10)
# ラベル付きフレーム内にテキストエリアを設置
textarea = tk.Text(labelframe)
textarea.pack(padx=10, pady=10)
root.mainloop()

ラベル付きフレームはGUIの中でカテゴリ分けしたいときに便利ですね。
スピンボックスの表示
GUIにスピンボックスを作成するには下記のメソッドを使用します。
tk.Spinbox(親ウィンドウ, from_=最小値, to=最大値)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIメインウィンドウ")
label.pack(pady=20)
# スピンボックスの作成&設置
spinbox = tk.Spinbox(root, from_=0, to=1000)
spinbox.pack()
root.mainloop()

任意の数値範囲でスピンボックスを作成できます。
キャンバスの表示
GUIに図形を描画できるキャンバスを表示してみましょう。
キャンバスを作成するには下記のメソッドを使用します。
tk.Canvas(親ウィンドウ)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=20)
# キャンバスの作成&設置
canvas = tk. Canvas(root)
canvas.pack()
canvas.create_oval(10, 10, 90, 90)
canvas.create_arc(30, 30, 70, 70)
root.mainloop()

GUI画面に図形や画像を表示することができます。
描画オプションがやや複雑なのが難点です…。
フレームの作成
GUIの各ウィジェットをまとめて格納できるフレームを作成してみましょう。
フレームの作成は下記のメソッドを使用します。
tk.Frame(親ウィンドウ)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# フレームの作成&設置
frame = tk.Frame(root)
frame.pack()
label = tk.Label(frame, text="ラベル1")
label.pack()
root.mainloop()

この状態だとテキストラベルが表示されているだけで、フレームの役割がわかりにくいですね。
GUIを開発する上でフレームはとても重要なのでしっかりマスターしましょう。
サイズ可変フレームの表示
GUIでサイズを変えられるウィジェットを作成するには下記のメソッドを使用します。
tk.PanedWinow(親ウィンドウ, orient=可変方向垂直or水平)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIアプリ画面")
label.pack(pady=20)
# サッシウィンドウの作成&設置
sashwindow = tk.PanedWindow(root, orient=tk.VERTICAL, sashwidth=10)
sashwindow.pack(expand=True, fill=tk.BOTH)
label1 = tk.Label(sashwindow, bg="blue", text="ラベル1")
label2 = tk.Label(sashwindow, bg="green", text="ラベル2")
sashwindow.add(label1)
sashwindow.add(label2)
root.mainloop()

サブウィンドウの表示
複数のウィンドウを表示することできます。
サブウィンドウを作成するには下記のメソッドを使用します。
tk.Toplebel(親ウィンドウ)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
label = tk.Label(root, text="GUIメインウィンドウ")
label.pack(pady=20)
# サブウィンドウの作成&設置
subwindow = tk.Toplevel(root)
subwindow.title("sub window GUI")
subwindow.geometry("240x120")
sublabel = tk.Label(subwindow, text="GUIサブウィンドウ")
sublabel.pack()
root.mainloop()

スライダーつまみを設置
ボリューム調節などに使われるスライダーを設置することができます。
スライダーを作成するには下記のメソッドを使用します。
tk.Scale(親ウィンドウ, orient=スライダーの移動方向垂直or水平)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# スライダーの作成&設置
slider = tk.Scale(root, orient=tk.HORIZONTAL)
slider.pack(pady=20)
root.mainloop()

スライダーを動かして値を変動させることができます。
メニューバーの設置
GUIにメニューバーを設置するには下記のメソッドを使用します。
tk.Menu(親ウィンドウ)
import tkinter as tk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# メニューバーの作成&設置
menubar = tk.Menu(root)
root.config(menu=menubar)
menu1 = tk.Menu(menubar)
menubar.add_cascade(label="設定", menu=menu1)
menu1.add_command(label="このアプリについて")
menu1.add_command(label="終了")
label = tk.Label(root, text="ラベル")
label.pack(pady=20)
root.mainloop()

macOSではGUIの外にメニューバーが設置されます。
メニューボタンの設置
GUIにメニューボタンを表示させてみましょう。
メニューボタンを作成するには下記のメソッドを使用します。
tk.Menubutton(親ウィンドウ, text=ボタン表示テキスト)
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("sample GUI app")
root.geometry("360x240")
# メニューボタンの作成&設置
menubutton = tk.Menubutton(root, text="メニューを開く")
menu = tk.Menu(menubutton)
menubutton["menu"] = menu
menu.add_command(label="start tkinter", command=None)
menu.add_command(label="end tkinter", command=None)
menubutton.pack(pady=20)
root.mainloop()

メニューごとにGUIの設定を切り替えたりする場合に役立ちますね。
デスクトップアプリ開発のまとめ
Pythonのtkinterライブラリを使えば、誰でもデスクトップアプリを開発することができます。
ぜひ使い方をマスターしてみてくださいね。