PySimpleGUIでFoucsOutを実装する

はじめに

前回投稿からすごーく時間経ってしまいましたが久しぶりに記事書きます。

最近PySimpleGUIでアプリ実装しててコントロールから「フォーカスが外れた時」にとある処理を実装したいと思い、

C#で言うLostFocusやLeaveみたいなイベントってPySimpleGUIで実装できないのかなと思って調べてみてたらそれっぽいのがありました。

とりあえず自分が希望してた動きはできたのでそれについて備忘録として残しておきます。

調べたサイト

参考にしたのはとりあえず公式のドキュメント。

イベントとかフォーカスとかで調べてたらPySimpleGUIでイベントが使えそうな記載を見つけました。

The Project - PySimpleGUI Documentation

どうやらtkinterのイベントを受信できる様子。

PySimpleGUIがtkinterのラッパーということで受信できる方法も用意されてるんですね。

window もしくはElementsにイベントをbindすることで機能してくれるようですね。

感覚的にはC#でWPFとかWindowFormでイベントをbindさせる処理と近いような遠くはないようなと言った感じ。

調べてる過程でこちらのGitHubのissueも参考にさせていただきました。

[ Enhancement/Question] How to find out if a GUI is in the foreground or background · Issue #2395 · PySimpleGUI/PySimpleGUI
Type of Issues (Question) Question: Is there any way to know if a PySimpleGUIQt/PySimpleGUI gui is currently in the foreground (directly accepting keyboard entr...

今回やりたかったことのコード

上記のissueのコードを参考にして自分が実装したかったコードを載せておきます。

import PySimpleGUI as sg

sg.change_look_and_feel('Dark Blue 3')

layout = [  [sg.In(key='-IN-')], 
            [sg.Button('Exit')] ]
window = sg.Window('FocusOut Test', layout, finalize=True)

window['-IN-'].bind('<FocusOut>', '+FOCUS OUT+')

while True:             
    event, values = window.read()
    if event in '-IN-+FOCUS OUT+':
        sg.popup_ok('フォーカスアウトされました')
    if event in (None, 'Exit'):
        break
window.close()

ここではKeyが-IN-のINのエレメントからフォーカスが外れた時に

「フォーカスアウトされました」というポップアップを表示するような処理にしてます。

IN エレメントからフォーカスが外れた時にevent-IN-+FOCUS OUT+という文字列を返してます。

なのでそれを捕まえてあげればフォーカスが外れたというタイミングで任意の処理が実装できそうだというとこで上記のような形になりました。

ハードコーディングでちょっと見辛い箇所はありますがそこは許してください。

最後に

PySimpleGUIでイベント実装ってどうやるんだろうってずっとモヤモヤしてましたが、

実装方法分かって色々できそうな幅が広がったなという感じです。

今回はフォーカスが外れた時という特定のタイミングでしたが、他にも色々イベントは用意されていますので、

気になる方はリンク貼りました公式ドキュメントの方を覗きに行っていただければ良いかなと思います。

とりあえず今日はこの辺で。

それではー

コメント

タイトルとURLをコピーしました