Pythonまとめ(TkEasyGUIお試し)
Pythonでよく使われているGUIライブラリとしてPySimpleGUIがある。PySImpleGUIはバージョン5より商用ライセンスが有償となるなどの変更があった。本稿ではMITライセンスで作成されたTkEasyGUIについて触れてみる。
基本的な利用例
多くの場面でPySimpleGUIと同じように書けば動作することが多い。ただ、完全互換を目指しているわけでは無いそうなので、ところどころ違いがある。
一度表示するだけ
import TkEasyGUI as eg
layout = [
[eg.Text("メッセージ") ],
[eg.Button("閉じる") ],
]
window = eg.Window("タイトル", layout)
window.read()
イベントループ型
import TkEasyGUI as eg
layout = [
[eg.Text("1行目") ],
[eg.Text("2行目"), eg.InputText("input", key="inputsample") ],
[eg.Text("3行目"), eg.Button("Push", key="-buttonpush-") ],
]
window = eg.Window("タイトル", layout)
while window.is_alive():
readresult = window.read()
match readresult:
case '-buttonpush-', value:
inputvalue = value['inputsample']
eg.popup_non_blocking(f"値は{inputvalue}です", title="ボタン")
case _:
break
window.close()
window.is_alive()でウィンドウが生きている間イベントループを繰り返す。window.read()でイベントを読み込み、読み込んだイベントに応じた処理を行う。
コンテキストマネージャ(with)使用
import TkEasyGUI as eg
layout = [
[eg.Text("1行目") ],
[eg.Text("2行目"), eg.InputText("input", key="inputsample") ],
[eg.Text("3行目"), eg.Button("Push", key="-buttonpush-") ],
]
with eg.Window("タイトル", layout) as window:
for event in window.event_iter():
match event:
case '-buttonpush-', value:
inputvalue = value['inputsample']
eg.popup_non_blocking(f"値は{inputvalue}です", title="ボタン")
case _:
break
これまで見たとおり、レイアウトの指定方法や、基本的な構文はPySimpleGUIと概ね同じように使用できる。
タイムアウトイベント使用
import TkEasyGUI as eg
layout = [
[eg.Text("1行目") ],
[eg.Text("2行目"), eg.InputText("input", key="inputsample") ],
[eg.Text("3行目"), eg.Button("Push", key="-buttonpush-") ],
]
with eg.Window("タイトル", layout) as window:
for event in window.event_iter(timeout=10000, timeout_key="-timeout-"):
match event:
case '-buttonpush-', value:
inputvalue = value['inputsample']
eg.popup_non_blocking(f"値は{inputvalue}です。", title="ボタン")
case '-timeout-', _:
eg.popup(f"指定の時間内でイベントが発生しませんでした。", title="タイムアウトエラー")
break
case _:
break
イベント関連
カスタムイベント
各エレメントであらかじめ定義されていないイベントも登録できる。よく使いそうなイベントは以下のあたり?
ButtonPress(Button), ButtonRelease, FocusIn, FocusOut, Enter, Leave, KeyPress(Key), KeyRelease, MouseWheel
全てのイベントはtkのドキュメントで確認できる(多分)。
bind使用
マウスオーバーしたら背景色を変えるサンプル
import TkEasyGUI as eg
inputbox = eg.InputText("ここに入力", key="-input-")
inputbox.bind("<Enter>", "enter")
inputbox.bind("<Leave>", "leave")
layout = [
[eg.Text("入力"), inputbox ],
[eg.Button("入力内容を表示", key="-button-"), ],
]
with eg.Window("タイトル", layout) as window:
for event in window.event_iter():
match event:
case '-button-', value:
inputvalue = value['-input-']
eg.popup(f"値は{inputvalue}です。", title="ボタン")
case '-input-enter', _:
window["-input-"].update(background_color="lightblue")
case '-input-leave', _:
window["-input-"].update(background_color="white")
case _:
break
bind_eventsで一括登録
マウスオーバーしたら背景色を変えるサンプル(2)
import TkEasyGUI as eg
inputbox = eg.InputText("ここに入力", key="-input-")
layout = [
[eg.Text("入力"), inputbox ],
[eg.Button("入力内容を表示", key="-button-"), ],
]
inputbox.bind_events({"<Enter>":"enter", "<Leave>":"leave"})
with eg.Window("タイトル", layout) as window:
for event in window.event_iter():
match event:
case '-button-', value:
inputvalue = value['-input-']
eg.popup(f"値は{inputvalue}です。", title="ボタン")
case '-input-enter', _:
window["-input-"].update(background_color="lightblue")
case '-input-leave', _:
window["-input-"].update(background_color="white")
case _:
break
ロングタスク
Window.start_threadを使う。
Window.start_thread(target:実行する関数, end_key:スレッドが終わったときに発生させるイベント名, 関数に渡す引数, ...)
入力値を使う時間がかかる処理をして、処理結果を表示する例を示す。
import time
import TkEasyGUI as eg
def longtask(inputvalue):
time.sleep(3)
return f"done {inputvalue}"
layout = [
[eg.Text("入力"), eg.Input("ここに入力", key="-input-"), ],
[eg.Button("入力内容を表示", key="-button-"), ],
]
with eg.Window("タイトル", layout) as window:
for event in window.event_iter():
match event:
case '-button-', value:
window["-input-"].update(readonly=True)
window["-button-"].update(disabled=True)
window.start_thread(longtask, "-end-process-", value["-input-"])
case '-end-process-', value:
window["-input-"].update(readonly=False)
window["-button-"].update(disabled=False)
eg.popup(f"処理結果は{value['-end-process-']}です。", title="処理終了")
case _:
break
外観
テーマ
eg.utils.set_themeメソッドが用意されているが、2024/11/17時点でWindowsでは動作しない模様。