messyなkitchenなブログ

ただひたすらに散らかった台所や人生やその他を晒す。

MENU

PySimpleGUI をさわってみる #2

はじめに

GUI のイベント発生を待たなければならないの?

PySimpleGUI のイベントループでは、window.read() でイベントの発生を待ちます。

イベントが発生するまで、ずーっと待ちます。

しかし、そんな動きだと困るケースも存在します。

でも大丈夫

時間が経つと、イベントが無くても .read() をするっと抜けることができるようです。

タイムアウトさせよう

一定時間後、.read() を抜けるよう、設定することができます。
例えば 1000[ms] でタイムアウトさせたい場合は、次のようにします。

event, values = window.read(timeout=1000, timeout_key='-timeout-')

そして、タイムアウトした場合は、eventtimeout_key で指定した値が入ります。

次のようにすれば、タイムアウトした場合に任意の処理を実行できます。

if event == '-timeout-':
    # タイムアウト発生時の処理をおこなう

やってみた例

表示

GUI を起動させ、何も操作しないと、1[sec] 毎にカウントアップした数値が表示されます。

f:id:messykitchen:20200513185151p:plain

コンソールには、Time out. の文字が出続けます。

f:id:messykitchen:20200513185209p:plain

ソースコード

import PySimpleGUI as sg

count = 0

# レイアウトを定義する
layout = [[sg.Text('Python GUI #2')], [sg.Text('', size=(10,1), key='-COUNT-')]]

# ウインドウを作成する
window = sg.Window('PySimpleGUI', layout)

# イベントループ
while True:
    # イベント読み出し タイムアウト付き
    event, values = window.read(timeout=1000, timeout_key='-timeout-')
    
    if event is None:
        break
        
    elif event == '-timeout-':
        # タイムアウト発生時の処理をおこなう
        count += 1
        window['-COUNT-'].update(f'Time out: {count}')
        print('Time out. ', end='')

# ウインドウを閉じる
window.close()

終わりに

GUI 部分のイベント読み出しでプログラムが停止してしまうと困るケースに対して、タイムアウトを設定することで簡単に停止しないようにすることができました。

スレッドを用いたりしても停止しないプログラムにすることができると思いますが、この方法を知っておくと何かしら応用ができる?かも?