【Tkinter挫折者必見】驚くほど簡単なPySimpleGUIの使い方

  • URLをコピーしました!
  • PythonでUIを実装したい!
  • でも難しすぎるのはイヤだな…
  • 実は以前にTkinterで挫折してしまった

このような方に激しくおすすめするのがPySimpleGUIです。

PythonのGUIといえばTkinterが有名ですが、ぶっちゃけ難しすぎて初心者からすると無駄にハードルが高いです。(僕もTkinter挫折組です)

PySimpleGUIはコードの書き方がシンプルで直感的でわかりやすくPython初心者でも簡単にキレイなGUI実装できるライブラリになっています。

本記事ではPySimplerGUIでUIを作り込むために必要な知識とサンプルコードを掲載しましたので、ぜひ真似をしつつ理想のGUIを作り上げてみてください!

初期設定

まずはPySimpleGUIをPythonで扱うため、pip installimportを行いましょう。

インストール

pip install PySimpleGUI

一般的なライブラリ同様、pip installでライブラリのインストールが可能です。

インポート

import PySimpleGUI as sg

毎度PySimpleGUIと入力して呼び出すのは冗長なので、sgとしてインポートすることが一般的です。

基本コマンド

もっとも単純なPySimpleGUIの構成は次のような感じになります。

import PySimpleGUI as sg

# UIの画面構成
layout = [
    [sg.Text("サンプルテキスト1")],
    [sg.Text("サンプルテキスト2")]
    ]

# ウィンドウをセット
window = sg.Window("title", layout=layout)

# ウィンドウを表示したままにする
while True:
    # UIからアクションや値を受け取る
    event, value = window.read()
    # ウィンドウの閉じるボタンが押されたらループから抜ける
    if event == None:
        break

# UIを終了する
window.close()

これをTkinterでやろうとするとウィジェットの配置等でごちゃっとしたコードになりがちですが、PySimpleGUIではこの通りスッキリとしています。

ここからはこちらのコードの中身を順に解説していきます。

レイアウトを設定

# UIの画面構成
layout = [
    [sg.Text("サンプルテキスト1")],
    [sg.Text("サンプルテキスト2")]
    ]

layoutという二次元リストを用意して、配置したい順番にウィジェットを要素に組み込んでいきましょう。

ウィンドウを設定

window = sg.Window("title", layout)

sg.Window()を使うことで、ウィンドウオブジェクトが生成されます。

  • arg1:アプリのタイトル
  • arg2:アプリのレイアウト(※)

上で作成した二次元配列を第二引数として渡します。

ウィンドウを表示させたままにする

while True:
    event, value = window.read()
    if event == None:
        break
window.close()

window.read()だけだとウィンドウは一瞬表示された後にすぐに消えてしまいます。

そこでwhile Trueで無限ループさせることで、特定の動作が起こるまではウィンドウを開いたままにします。

例えば、ウィンドウの「X」ボタンが押された時にはアプリを閉じますよね。

アプリの閉じるボタンがクリックされた場合にはwindows.read()eventという戻り値はNoneとなりますから、3, 4行目のようにif文を組むことで無限ループから抜けることができます。

最終的にwindow.close()でUI画面は閉じられることになります。

ウィジェットの種類

layoutのリスト要素として渡すウィジェットには次のような種類があります。

ウィジェットの種類
  • Text
  • Button
  • Popup
  • CheckBox
  • Radio

これらのウィジェットを引数つきでlayoutリストの要素として組み込んであげることで、理想通りのGUIを作成できます。

Text

sg.Text()
sg.InputText()
sg.Multiline()

テキスト系のウィジェット上記の通りで、大きく3種類が用意されています。

テキスト系ウィジェットの種類
  • sg.Text():書き込みできないラベルのようなもの
  • sg.InputTexst():1行分のテキストボックス
  • sg.Multiline():複数行のテキストボックス
size = (40, 3)         # 幅40文字分、高さ3文字分
font = ('meiryo', 13)  # メイリオ、サイズは13
sg.InputText('文字列', size=size, font=font, default_text='事前に入力するテキスト')

これらのテキスト系ウィジェットは、引数を渡すことで細かい設定ができます。

button

sg.Button()

sg.Button()とすることでボタンを設置できます。

# メイリオ、サイズは13
font = ('meiryo', 13)

sg.Button('SUBMIT', font=font, key='btn_submit')

テキストウィジェットとボタンウィジェットの一番の違いは、クリックされた時に別の動作を発火させる必要がある点です。

そこでsg.Button()の引数としてkeyを指定します。

keywindow.read()の戻り値であるeventという変数で受け取ることができます。

これによりwhile Trueの無限ループ内でif文を組むことで、ボタンがクリックされた場合のアクションを指定できるようになります。

# 配置を決定
layout = [[sg.Button('SUBMIT', key='btn_submit')]]

# ウィンドウを表示
window = sg.Window("Sample", layout=layout)

# 無限ループ
while True:
    event, value = window.read()
    if event == 'btn_submit':
        print('SUBMITボタンがクリックされました。')
        break

上記のコードでは、SUBMITボタンがクリックされるとprint関数(SUBMITボタンがクリックされました。)が表示されます。

ポップアップを入れる

# OKボタンを表示するタイプ
sg.popup('処理が完了しました。')
# yes, noで答えるタイプ
sg.PopupYesNo('処理を実行しますか?')

よく使うポップアップは上記の2つです。

PopupYesNoの戻り値はYesの場合は”Yes”、Noの場合は”No”になるのでif文で条件分岐させて狙った動作をさせるようにしましょう。

チェックボックス

sg.Checkbox()

チェックボックスも実装可能で、プロパティの設定には次のように引数を渡すことになります。

# メイリオ、サイズは13
font = ('meiryo', 13)

sg.Checkbox('文字列', font=font, default=False, key='check_A')

keyを指定することでチェックがされているかどうかをPython側で受け取ることができ、チェック済みならTrueチェックされていなければFalseとなります。

ラジオボタン

sg.Radio()

ラジオボタンはsg.Radio()で実装できます。

# メイリオ、サイズは13
font = ('meiryo', 13)

sg.Radio('文字列', size=size, default=False, group_id='group_1')

チェックボックスと違ってgroup_idという引数を指定する必要があります。ラジオボタンはグループの中で一つしか選択できないからです。

またそれに伴ってdefaultの選択もしておくのがおすすめです。どれか一つの要素をTrueとしておくことで、要素が選択されないまま進んでしまうことが防げます。

ファイルパスの取得

sg.FileBrowse()

フォルダパスの取得

sg.FolderBrowse()

sg.FolderBrowse('表示したいテキスト', size=(幅,  高さ), font=('フォント名', サイズ))

番外編

テーマを変更する

# テーマ一覧を表示する
sg.theme_previewer()

こちらのコードでPySimpleGUIのテーマ一覧を以下のような形で確認できます。

テーマサンプルの上の方に表示されている「テーマ名」を控えて、次のようにコード内に記述することでテーマを変更できます。

sg.theme('Default1')

デフォルトだとちょっと奇抜な見た目なので、Default1あたりが使いやすいかなと思います。

おわりに

今回ご紹介したコードをうまく組み合わせれば、よほど複雑なものを目指さない限り目当てのGUIアプリは実装できると思います。

今回の方法でGUIを実装できたら、Pyinstallerを使ったバイナリファイル化にも挑戦してみましょう。

この記事が気に入ったら
フォローしてね!

シェアしてもらえると喜びます!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Pythonを使ってプログラムを書くお仕事をしています。
業務自動化プログラムの作成が得意で、物販のお仕事をされている方や士業事務所様に業務効率化のツールをご提供させていただいております。
現在自力でWebサービスを作れるようになるべくDjangoを学習中。
お仕事のご相談はお気軽にご連絡ください。

コメント

コメントする