- PythonでUIを実装したい!
- でも難しすぎるのはイヤだな…
- 実は以前にTkinterで挫折してしまった
このような方に激しくおすすめするのがPySimpleGUIです。
PythonのGUIといえばTkinterが有名ですが、ぶっちゃけ難しすぎて初心者からするとハードルが高いです。
PySimpleGUIはコードの書き方がシンプルで直感的でわかりやすく、Python初心者でも簡単にキレイなGUI実装できるライブラリになっています。
本記事ではPySimplerGUIでUIを作り込むために必要な知識とサンプルコードを掲載しましたので、ぜひ真似をしつつ理想のGUIを作り上げてみてください!
初期設定
まずはPySimpleGUIをPythonで扱うため、pip install
とimport
を行いましょう。
インストール
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
を指定します。
key
はwindow.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を使った実行ファイル化にもチャレンジしてみましょう!
コメント