はじめに
PySimpleGUIでアプリ作ってたんですが、
その中でメインWindowにInputTextのコントロールがある状態でPopupを表示→Popupを閉じると
メインWindowのInputTextへの入力が効かなくなってしまってその対処法を調べたので、
備忘録がわりに方法を書いておきます。
発生した挙動
例えば以下のようにポップアップを表示するボタンとInputTextがあるようなウィンドウでボタン押下でPopupを表示します。
表示するPopupは以下のようなただのOKボタンが実装されたPopupです。
sg.popup('ポップアップを表示します。')
のような標準のポップアップを表示する処理です。
全体のコードとしては以下のようなものです。
# -*- coding: utf-8 -*-
import PySimpleGUI as sg
sg.theme('Dark Blue 3')
layout = [
[sg.Button('ポップアップ表示', key='-POPUP-')],
[sg.Text('入力確認', size=(15, 1)), sg.InputText('1.0', size=(5, 2))],
]
# ウィンドウ生成
window = sg.Window('ポップアップテスト', layout)
while True:
event, values = window.read()
if event is None:
print('exit')
break
if event == '-POPUP-':
value = sg.popup('ポップアップを表示します。')
# ウィンドウ破棄
window.close()
上記の処理でPopupを閉じて、「入力確認」の箇所のInputTextに文字入力しようとしてみても
そもそもInputTextにフォーカスが当たらず文字入力できない状態になってしまいました。
対処した方法
自分がやってみたのはPopup表示のメソッドの引数に
non_blocking
のパラメータをTrueに設定して表示してみたところ、
Popupを表示した後でもInputTextへの入力が出来るようになりました。
コードとしては以下になります。popupの引数にnon_blocking=True
を渡してあげただけです。
# -*- coding: utf-8 -*-
import PySimpleGUI as sg
sg.theme('Dark Blue 3')
layout = [
[sg.Button('ポップアップ表示', key='-POPUP-')],
[sg.Text('入力確認', size=(15, 1)), sg.InputText('1.0', size=(5, 2))],
]
# ウィンドウ生成
window = sg.Window('ポップアップテスト', layout)
while True:
event, values = window.read()
if event is None:
print('exit')
break
if event == '-POPUP-':
value = sg.popup('ポップアップを表示します。', non_blocking=True)
# ウィンドウ破棄
window.close()
non_blockingの働き
公式のドキュメント を読んでみるとnon_blocking
についての説明があります。
Google翻訳かけてみると以下のような訳が出てきました。
Trueの場合、ユーザーの入力を待たずに関数からすぐに戻ります。
また、Popup Outputの説明の中にはPopupは通常、Blockingの状態で呼び出される旨の記載もあります。
どうやらnon_blocking
をTrueで呼び出すことで非同期の状態で呼び出して処理してくれているようです。
非同期なのでそのおかげでWindowの処理が止まることなく動いてくれて、
InputTextの処理も影響されずに動作してくれているみたいです。
同期されている状態でPopupを呼び出すと何か処理がPopup側に残ってしまっているのかもしれないですが、ここら辺がちょっとわかっていない・・・。
思い通りの動きにはなりましたが、原因がまだ深く分かっていないので要調査です。
おそらく今回はただPopupにメッセージを出したいだけだったのでこれでもよかったですが、
Popup側で何か制御が必要な場合はうまく動かないかもしれないですね。
今回は非同期の方が自分の望んでいる動きをしてくれているのでいいですけど、
またちょっと違った実装したい時は動きを確認してみたいと思います。
最後に
動きはしたけど原因ちゃんと分かっていない動作はモヤモヤするので早くちゃんと理解せねば。
設定忘れないようにということで取り急ぎ記事としてまとめましたが、
GUIアプリ作る際はいつもここら辺でつまずくんですよね・・・。
C#の時もここら辺の挙動把握するのが大変だった記憶があります。
きっと作成してたらまた何か問題出てくると思うのでその時はまた何かしらで記事書きます。
それでは今日はこの辺で。
それでは〜
コメント