2024/05/21(火) [n年前の日記]
#2 [python] PySimpleGUIの代替ライブラリTkEasyGUIを試用
Python でGUIアプリを作りやすくする、PySimpleGUI というライブラリがある。Tcl/Tk のGUI関係を担当してる Tk を、Pythonから使えるようにした tkinter というライブラリがPythonには標準で添付されているのだけど、ちょっと使い勝手がよろしくないので、tkinter にラッパーを被せて使いやすくするのが PySimpleGUI。
ただ、この PySimpleGUI、バージョン5から有償、かつ、公式サイトにユーザ登録しないと使えない状態になってしまった…。
そこで作られた代替ライブラリが TkEasyGUI。
_tkeasygui-python/README-ja.md at main ・ kujirahand/tkeasygui-python
_TkEasyGUI - Pythonで最も素早くデスクトップアプリを創るライブラリ|kujirahand
_ゼロからはじめるPython(115) 簡単GUIライブラリ「PySimpleGUI 5」の有償化と互換ライブラリについて | TECH+(テックプラス)
_TkEasyGUI
_TkEasyGUI(Python)で簡単GUI(PySimpleGUI有料化に伴い移行します!) - daisukeの技術ブログ
import PySimpleGUI as sg を、import TkEasyGUI as sg に書き換えるだけで、簡単なサンプルならそのまま動いてしまうらしい。もっとも、互換性は重視していないとのことなので…。
気になったので試用してみた。環境は Windows10 x64 22H2 + Python 3.10.10 64bit。
pipでインストール。
手元にあったサンプルを修正して試してみたけど、ラベル、ボタン、テキスト入力ボックス等、簡単なサンプルで使われてるウィジェットのレイアウトについては問題無さそうに見えた。
ただ、ウインドウの閉じるボタンを押したときの処理は、少し手直しが必要っぽい。PySimpleGUI は、event に None が入ってきたときにメインループを抜けるように(breakするように)書くけれど、TkEasyGUI の場合は、WIN_CLOSED もしくは WINDOW_CLOSED が飛んできたときに抜けるように書かないといけないようだなと…。また、メインループは無限ループにせず、window.is_alive() を見てループするようにしたほうが良さそう。
また、Listbox() を使ったサンプルはエラーが出てしまった。TkEasyGUI には change_submits というパラメータが無いらしい。代わりに、enable_events というパラメータが用意されているっぽい。
例えば、PySimpleGUI の以下のサンプルは、そのあたりを修正すれば TkEasyGUI でも動いてくれる。
_PySimpleGUI/DemoPrograms/Demo_Img_Viewer.py at master - PySimpleGUI/PySimpleGUI
ただ、Image() のサイズを、画像サイズで自動調整してくれるわけではないようで、Image() に size=(1280,720) 等を固定で指定してやらないといけないっぽい。
ただ、この PySimpleGUI、バージョン5から有償、かつ、公式サイトにユーザ登録しないと使えない状態になってしまった…。
そこで作られた代替ライブラリが TkEasyGUI。
_tkeasygui-python/README-ja.md at main ・ kujirahand/tkeasygui-python
_TkEasyGUI - Pythonで最も素早くデスクトップアプリを創るライブラリ|kujirahand
_ゼロからはじめるPython(115) 簡単GUIライブラリ「PySimpleGUI 5」の有償化と互換ライブラリについて | TECH+(テックプラス)
_TkEasyGUI
_TkEasyGUI(Python)で簡単GUI(PySimpleGUI有料化に伴い移行します!) - daisukeの技術ブログ
import PySimpleGUI as sg を、import TkEasyGUI as sg に書き換えるだけで、簡単なサンプルならそのまま動いてしまうらしい。もっとも、互換性は重視していないとのことなので…。
PySimpleGUIと完全な互換性は考えていませんTkEasyGUI より
気になったので試用してみた。環境は Windows10 x64 22H2 + Python 3.10.10 64bit。
pipでインストール。
python -m pip install TkEasyGUI
手元にあったサンプルを修正して試してみたけど、ラベル、ボタン、テキスト入力ボックス等、簡単なサンプルで使われてるウィジェットのレイアウトについては問題無さそうに見えた。
ただ、ウインドウの閉じるボタンを押したときの処理は、少し手直しが必要っぽい。PySimpleGUI は、event に None が入ってきたときにメインループを抜けるように(breakするように)書くけれど、TkEasyGUI の場合は、WIN_CLOSED もしくは WINDOW_CLOSED が飛んできたときに抜けるように書かないといけないようだなと…。また、メインループは無限ループにせず、window.is_alive() を見てループするようにしたほうが良さそう。
# PySImpleGUI event loop while True: event, values = window.read() if event is None: print('exit') break window.close()
# TkEasyGUI event loop while window.is_alive(): event, values = window.read() if event == eg.WIN_CLOSED or event == eg.WINDOW_CLOSED: print('event == eg.WIN_CLOSED. Exit') break window.close()
また、Listbox() を使ったサンプルはエラーが出てしまった。TkEasyGUI には change_submits というパラメータが無いらしい。代わりに、enable_events というパラメータが用意されているっぽい。
# PySimpleGUI col_files = [[sg.Listbox(values=fnames, change_submits=True, size=(60, 30), key='listbox')], [sg.Button('Next', size=(8, 2)), sg.Button('Prev', size=(8, 2)), file_num_display_elem]]
# TkEasyGUI col_files = [[eg.Listbox(values=fnames, size=(60, 30), key="listbox", enable_events=True)], [ eg.Button("Next", size=(8, 2)), eg.Button("Prev", size=(8, 2)), file_num_display_elem]]
例えば、PySimpleGUI の以下のサンプルは、そのあたりを修正すれば TkEasyGUI でも動いてくれる。
_PySimpleGUI/DemoPrograms/Demo_Img_Viewer.py at master - PySimpleGUI/PySimpleGUI
ただ、Image() のサイズを、画像サイズで自動調整してくれるわけではないようで、Image() に size=(1280,720) 等を固定で指定してやらないといけないっぽい。
◎ PySimpleGUIの以前のバージョン :
PySimpleGUI がバージョン5になる前の、最後のバージョンはいくつだったんだろう…。
手元の環境には、4.60.5 が入っていた。これが以前のライセンスで使える最後のバージョンと言うことになるのかな?
以下のやり取りによると、ライセンス変更前のソースを fork して残してくれた方が居るらしい。
_PySimpleGUI 4 will be sunsetted in Q2 2024 | Hacker News
_andor-pierdelacabeza/PySimpleGUI-4-foss: Mirror of the last GPL version of PySimpleGUI repository
_gabrielsroka/PySimpleGUI
ちなみに、元々の PySimpleGUI は、PySimpleGUI.py という1ファイルだけを配布してる状態だったので、該当ファイルだけ手元に残しておけば以前の版を使い続けることができそうな気もする。
もっとも、PySimpleGUI は tkinter のラッパーだから、直接 tkinter を使って自分でチマチマ書いていけば同じ処理ができるような気もするなと…。
> pip list | grep PySimpleGUI PySimpleGUI 4.60.5 PySimpleGUIQt 0.35.0 PySimpleGUIWx 0.17.2
手元の環境には、4.60.5 が入っていた。これが以前のライセンスで使える最後のバージョンと言うことになるのかな?
以下のやり取りによると、ライセンス変更前のソースを fork して残してくれた方が居るらしい。
_PySimpleGUI 4 will be sunsetted in Q2 2024 | Hacker News
_andor-pierdelacabeza/PySimpleGUI-4-foss: Mirror of the last GPL version of PySimpleGUI repository
_gabrielsroka/PySimpleGUI
ちなみに、元々の PySimpleGUI は、PySimpleGUI.py という1ファイルだけを配布してる状態だったので、該当ファイルだけ手元に残しておけば以前の版を使い続けることができそうな気もする。
もっとも、PySimpleGUI は tkinter のラッパーだから、直接 tkinter を使って自分でチマチマ書いていけば同じ処理ができるような気もするなと…。
◎ guizeroという選択肢もある :
tkinterを使いやすくするラッパーとしては、guizero というライブラリ(モジュール)もあるので一応メモしておく。
_guizero
_PythonとguizeroでGUIアプリケーションを手軽に作ってみる - あっきぃ日誌
ラベルやボタンを配置して動かすだけなら、これでもいいのかもしれない。以下を眺めれば、圧倒的に簡単に使えることが分かるかと。
_Getting started - guizero
_guizero
_PythonとguizeroでGUIアプリケーションを手軽に作ってみる - あっきぃ日誌
ラベルやボタンを配置して動かすだけなら、これでもいいのかもしれない。以下を眺めれば、圧倒的に簡単に使えることが分かるかと。
_Getting started - guizero
[ ツッコむ ]
以上です。