本連載では以前Tkinterを使ってデスクトップアプリを作る方法を紹介した。Tkinterもそれほど難しくないものの、PySimpleGUIを使うともっと簡単にデスクトップアプリが作れると話題だ。今回は、話題のPySimpleGUIを使って、日給計算アプリを作ってみよう。

  • PySimpleGUIを使って日給計算アプリを作ってみよう

    PySimpleGUIを使って日給計算アプリを作ってみよう

PySimpleGUIについて

PySimpleGUIとは2018年より開発されているデスクトップアプリを作るためのライブラリだ。GUIとはGraphical User Interfaceの略で、ボタンやテキストボックスなど、マウスやタップ操作に応じて反応するインターフェイスのことだ。

もともと、PythonでGUIを持ったアプリを作るのには、Tkinter、Qt、WxPythonなどのライブラリが利用されてきた。実際のところ、PySimpleGUIはこれら既にあるGUIライブラリのラッパーだ。元のライブラリでプログラムを書くよりも半分ほどの長さで、GUIのプログラムを作成できるのが特徴だ。最近、マニュアルも日本語化され、ますます身近になった。

  • PySimpleGUIの日本語マニュアル

    PySimpleGUIの日本語マニュアル

PySimpleGUIをインストールしよう

PySimpleGUIはPythonの標準ライブラリではない。コマンドラインからpipコマンドを使って別途インストールが必要となる。WindowsではPowerShellを起動して以下のコマンドを実行してみよう

# Windowsの場合
pip install PySimpleGUI
  • PowerShellでPySimpleGUIをインストールしたところ

    PowerShellでPySimpleGUIをインストールしたところ

なお「Successfully installed PySimpleGUI-4.xx.xx」と表示されたらインストールが成功したことを表している。もし、インストールがうまく行かない場合、pipコマンドにパスが通っていない可能性がある。

その場合、一度、古いPythonをアンインストールして、改めてこちらから最新のPythonをインストールしてみよう。その際、「Add Python 3.x to PATH」(パスにPythonを追加)という項目にチェックしてみよう。すると、PowerShellからPythonが利用可能になる。

【macOSやLinuxの場合】

macOSやChromebookなど各種Linuxでは「ターミナル」(macOSならターミナル.app)を起動して、以下のコマンドを実行しよう。

# macOS / Linuxの場合
pip3 install PySimpleGUI

PySimpleGUIの簡単な使い方

pipでライブラリをインストールしたら、PythonのIDLEを起動して、PySimpleGUIが正しく利用できるか確かめてみよう。IDLEのシェルで「>>>」に続けて以下の2文を入力する。

import PySimpleGUI as sg
sg.popup("洞察力があればすぐに怒ることはない。", title="格言")

すると、以下のようにダイアログに格言が表示されるはずだ。

  • PySimpleGUIのpopupメソッドを使ったところ

    PySimpleGUIのpopupメソッドを使ったところ

PySimpleGUIには、popupメソッドのように手軽に使えるダイアログが用意されている。例えば、ファイルを選択するダイアログを表示するには、popup_get_fileメソッドを使う。

import PySimpleGUI as sg
fname = sg. popup_get_file("ファイルを選択")
sg.popup(fname)
  • PySimpleGUIのファイル選択ダイアログを表示したところ

    PySimpleGUIのファイル選択ダイアログを表示したところ

簡単なアプリを作ってみよう

そして、PySimpleGUIが素晴らしい点だが、Pythonのリストを用いて画面レイアウトを表現できる点にある。簡単なアプリを作ってみよう。

ここでは、日給計算アプリを作ってみよう。日給計算では、開始時刻と終了時刻、時給、休憩時間など複数の項目を入力する必要がある。PySimpleGUIを使えば、複数の入力項目も手軽に指定できる。

とは言え、一気にプログラムを作ると分かりづらいので、まずは入力ボックスだけ表示するプログラムを作ってみよう。

import PySimpleGUI as sg

# 画面レイアウトを指定 ---- (*1)
layout = [
  [sg.Text('日給計算アプリ')],
  [sg.Text('開始時間', size=(15,1)), sg.InputText('09:00')],
  [sg.Text('終了時間', size=(15,1)), sg.InputText('17:00')],
  [sg.Text('休憩時間', size=(15,1)), sg.InputText('1:00')],
  [sg.Text('時給', size=(15,1)), sg.InputText('1100')],
  [sg.Submit(button_text='計算')]]

# イベントループ --- (*2)
win = sg.Window('日給計算', layout)
while True:
  event, values = win.read()
  if event is None: break
  if event == '計算':
    # ここで日給を計算
    sg.popup('ここで日給を計算')
    break

上記のプログラムを「nikkyu-pre.py」という名前で保存しよう。そして、IDLEのメニューより[File > Open]で保存したプログラムを選び、[F5]キーを押して実行すると、(*1)のレイアウトで指定した画面がそのままフォームとしてウィンドウに表示される。

また、WindowsでもmacOSでも同じように実行できたのを確認できる。

  • Windowsで実行したところ

    Windowsで実行したところ

  • macOSで実行したところ

    macOSで実行したところ

プログラムを確認してみよう。(*1)では画面レイアウトを指定する。Pythonの二次元のリスト内に、sg.Textやsg.InputTextのように配置したいオブジェクトを指定するだけだ。sg.Textがラベルテキスト、sg.InputTextが入力ボックス、sg.Submitが決定ボタンだ。

そして、(*2)ではウィンドウを表示してイベントループを実行します。sg.Windowメソッドを実行するとウィンドウが表示される。その後、while文でイベントを拾ってどんな処理を行うのかを記述する。

ここまでの部分で、PySimpleGUIの基本を紹介した。次に時給計算のプログラムを完成させてみよう。

import PySimpleGUI as sg

# 画面レイアウトを指定
layout = [
  [sg.Text('日給計算アプリ')],
  [sg.Text('開始時間', size=(15,1)), sg.InputText('09:00')],
  [sg.Text('終了時間', size=(15,1)), sg.InputText('17:00')],
  [sg.Text('休憩時間', size=(15,1)), sg.InputText('1:00')],
  [sg.Text('時給', size=(15,1)), sg.InputText('1100')],
  [sg.Submit(button_text='計算')]]

# ウィンドウを表示する関数
def show_window():
  win = sg.Window('日給計算', layout)
  # イベントループ
  while True:
    event, values = win.read()
    if event is None: break
    if event == '計算': # --- (*1)
      calc_payment(values)

# 時給計算 --- (*2)
def calc_payment(values):
    # フィールドから値を取得
    start_t = timestr_to_min(values[0])
    end_t = timestr_to_min(values[1])
    rest_t = timestr_to_min(values[2])
    jikyu = values[3]
    # 取得した値から時給を計算
    m = (end_t - start_t - rest_t)
    val = int((m / 60) * float(jikyu))
    # 結果を表示
    sg.popup("結果:" + str(val) + "円")

# HH:MMの形式を分に変換 --- (*3)
def timestr_to_min(hm):
    h, m = hm.split(":") # 時と分に分ける
    return int(h) * 60 + int(m)

show_window()

上記のプログラムを「nikkyu.py」という名前で保存したら、IDLEで実行してみよう。 「計算」ボタンを押すと日給が計算されてダイアログに表示される。

  • 日給計算アプリを実行したところ

    日給計算アプリを実行したところ

プログラムを確認してみよう。PySimpleGUIを使って画面を表示するところまでは、先ほどと同じだ。(*1)の部分では、ウィンドウを表示した後、イベントループで計算ボタンを押した時にcalc_payment関数が実行されるように指定する。レイアウト内でsg.Submitメソッドを使って作ったボタンラベルがイベントループのeventに設定される。

そして、(*2)以降の部分で時給計算を行う。ここでポイントとなるのが、フィールドの値を取得している部分だ。イベントループで取得した値valuesはリスト型の変数だ。この変数にレイアウトで指定した順番にユーザーが入力した値が入っている。(*3)では「HH:MM」のような形式で入力した文字列を分の形式で取得する。この分の値を元に日給を計算する。

まとめ

今回はPySimpleGUIを使ってデスクトップアプリを作る方法を紹介した。自作ツールを配布する場合、デスクトップアプリとして提供する場合が多いが、PySimpleGUIを使えばちょっとしたツール制作が一層簡単になるので活用しよう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。