PySimpleGUIで、ウィンドウ内の情報を自動的に更新するGUIアプリが簡単に作れます。
GUIアプリを作るには、ユーザからの操作に応じて処理を行うだけでなく、アプリが自動的に処理を実行する(例えば、情報を更新する)ことも必要になる場合があります。
PySimpleGUIでは、簡単にウィンドウ内の情報を自動的に更新するGUIアプリが作れます。
この記事に載っているサンプルコードをコピーして、Pythonで実行すれば、簡単に動きを確認できますので、是非試してみて下さい。
この記事では、公式サイトから、各テーマに沿った内容を紹介しています。公式サイトは、英語で書かれており、多くの情報が載っていますが、ちょっと読みづらいです。
この記事では、初心者にもわかりやすいように、各処理の内容を、サンプルコード内にコメントとして載せています。
もう少し詳しく知りたい方は、公式サイトも見に行ってください。
【無料オンライン】ゼロから始めるPythonプログラミング入門講座(週5開催) テックジム\ Pythonでプログラムを作るのなら、ラズパイ。環境構築も楽で、おすすめです。 /
入力待ちのタイムアウトを利用して、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アプリの作り方を紹介しました。
\ Pythonでプログラムを作るのなら、ラズパイ。環境構築も楽で、おすすめです。 /
コメント