【Python(PySimpleGUI)でGUIアプリ入門】自動的に表示内容を更新するGUIアプリを作る方法

PySimpleGUI
けんろう
けんろう

PySimpleGUIで、ウィンドウ内の情報を自動的に更新するGUIアプリが簡単に作れます。

GUIアプリを作るには、ユーザからの操作に応じて処理を行うだけでなく、アプリが自動的に処理を実行する(例えば、情報を更新する)ことも必要になる場合があります。

PySimpleGUIでは、簡単にウィンドウ内の情報を自動的に更新するGUIアプリが作れます。

この記事に載っているサンプルコードをコピーして、Pythonで実行すれば、簡単に動きを確認できますので、是非試してみて下さい。

この記事では、公式サイトから、各テーマに沿った内容を紹介しています。公式サイトは、英語で書かれており、多くの情報が載っていますが、ちょっと読みづらいです。

この記事では、初心者にもわかりやすいように、各処理の内容を、サンプルコード内にコメントとして載せています。

もう少し詳しく知りたい方は、公式サイトも見に行ってください。

【無料オンライン】ゼロから始めるPythonプログラミング入門講座(週5開催) テックジム
広告

入力待ちのタイムアウトを利用して、500ms毎にカウントアップしていくGUIアプリ

このサンプルコードは、
・下段のテキスト出力欄2には、数値が500ms毎にカウントアップしていきます。
・上段のテキスト出力欄1は、「GO」ボタンを押す度に、テキストを挿入してきます。

サンプルコード


#!usr/bin/env python
# -*- coding: utf-8 -*-

import PySimpleGUI as sg

# レイアウト(1段目:テキスト、テキスト出力欄、2段目:テキスト、テキスト出力欄、3段目:ボタン、ボタン、ボタン)
layout = [    [sg.Text('テキスト出力欄1'), sg.MLine(key='-ML1-'+sg.WRITE_ONLY_KEY, size=(40,8))],
                    [sg.Text('テキスト出力欄2'), sg.MLine(key='-ML2-'+sg.WRITE_ONLY_KEY,  size=(40,8))],
                    [sg.Button('Go'), sg.Button('Exit')]]


window = sg.Window('Window Title', layout, finalize=True)


# テキスト出力欄1に、テキストを表示
window['-ML1-'+sg.WRITE_ONLY_KEY].print(1,2,3,4,end='', text_color='red', background_color='yellow')
window['-ML1-'+sg.WRITE_ONLY_KEY].print('\n', end='')
window['-ML1-'+sg.WRITE_ONLY_KEY].print(1,2,3,4,text_color='white', background_color='green')
counter = 0

while True:

    # ユーザからの入力を待ちます。500ms待っても、入力がない場合は、次の処理に進みます。
    event, values = window.read(timeout=500)

    # ウィンドウの右上の×を押したときの処理、「Exit」ボタンを押したときの処理
    if event in (sg.WIN_CLOSED, 'Exit'):
        break

    # 「Go」ボタンを押したときの処理
    if event == 'Go':

        # テキスト出力欄1に、「GO」を表示する
        window['-ML1-'+sg.WRITE_ONLY_KEY].print(' GO ', text_color='red')

    # テキスト出力欄2に、カウンタ値を表示する
    window['-ML2-'+sg.WRITE_ONLY_KEY].print(counter)

    # カウンタは、500ms毎に、カウントアップする
    counter += 1

window.close()

実行すると、

・下段のテキスト出力欄2に、500ms毎にカウントアップした数値が更新されていきます。

広告

スレッドを利用して、1秒毎に処理を実行するGUIアプリ

このサンプルコードは、スレッドを利用したGUIアプリです。

「Start」ボタンを押すと、スレッドが生成して、1秒ごとにテキストを表示します。
また、「Start」ボタンを押す度に、新しいスレッドを追加できます。

サンプルコード


#!usr/bin/env python
# -*- coding: utf-8 -*-

import threading
import time
import PySimpleGUI as sg

THREAD_EVENT = '-THREAD-'

cp = sg.cprint

def the_thread(window):

    i = 0
    while True:

        # スレッドが発生したことを表示
        cp(' スレッド発生 ', c='white on green')

        # 1秒スリープ
        time.sleep(1)

        # スレッドから、データ(スレッド名、カウンタ)を送信
        window.write_event_value('-THREAD-', (threading.current_thread().name, i))

        i += 1


def main():

    layout = [
                [sg.T(' テキストを入力してください ')],
                [sg.Input(key='-IN-', size=(30,1))],
                [sg.Text(' テキスト出力エリア ', font='Any 15')],
                [sg.Multiline(size=(65,20), key='-ML-', autoscroll=True, reroute_stdout=True, write_only=True, reroute_cprint=True)],
                [sg.B('Start'), sg.B(' 挿入 '), sg.Button('Exit')]  ]

    window = sg.Window(' サンプルアプリ ', layout)

    while True:

        # ユーザからの入力を待ちます。入力があると、次の処理に進みます。
        event, values = window.read()

        # ボタンイベントを表示
        cp(event, values)

        # ウィンドウの右上の×を押したときの処理、「Exit」ボタンを押したときの処理
        if event == sg.WIN_CLOSED or event == 'Exit':
            break

        # 「Start」を押したときの処理
        if event.startswith('Start'):

            # the_threadを起動する
            threading.Thread(target=the_thread, args=(window,), daemon=True).start()

        # スレッドからのイベントを受信時の処理
        if event == THREAD_EVENT:

            # スレッドからのデータを表示
            cp(f' スレッドからのデータ ', colors='white on purple', end='')
            cp(f'{values[THREAD_EVENT]}', colors='white on red')

    window.close()

if __name__ == '__main__':
    main()

実行すると、以下のようになります。

「Start」ボタンを押すと、スレッドが生成して、1秒ごとにテキストを表示します。

また、「Start」ボタンを押す度に、新しいスレッドを追加できます。

広告

まとめ

今回は、Pythonライブラリである、PySimpleGUIで、アプリ自身が自動的に処理を実行するアプリとして、定期的にカウントアップするGUIアプリの作り方を紹介しました。

コメント

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