PySimpleGUIで無限ループを停止するプログラム

スポンサーリンク

PySimpleGUIで無限ループを停止するプログラムのサンプルです。
スレッドの開始、変更、停止を行います。

スポンサーリンク

参考サイト

Pythonで無限ループを行うプログラムについて

  • 任意のタイミングで止めたい
  • できればGUIで「停止」ボタンで止めたい

と思い検索していたところ、

ピッタリなものを作られているサイトがありました!

tkinterで書かれているこちらのサンプルをPysimplGUI仕様にしたものです。

PysimpleGUIでスレッドの開始、変更、停止を制御

サンプルプログラムの処理は参考元HPと同じです。

  • 1秒毎にprint文で番号を実行
  • 「change」ボタンでprint番号に+1
  • 「stop」または「×」ボタンでスレッドを破棄してアプリを終了する

イメージ

プログラムの実行でウインドウが開きます

PySimpleGUIPattern2B

「Start」を押すとステータスに(実行中)と表示され、1秒おきに数字がprintされます。

PysimpleGUIで無限ループを実行した時の挙動

「Change」を押すとステータスに(変更しました)と表示され、変更された数字が1秒おきにprintされます。

「stop」ボタンを押すとウインドウが閉じ、スレッドを終了します。

サンプルプログラム

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

 

import time
import threading
import sys
import PySimpleGUI as sg
 


#スレッド処理のクラス
class Receive():
    def __init__(self): #初期化
        self.ROOP = False #ループのフラグ
        self.num = 1

 

    #ループ処理関数
    def target(self):
        while (self.ROOP):
            #ここにループする処理を記載
            print ("number : ", self.num)
            time.sleep(1) #1秒待機

 

    #スレッドをスタートさせる
    def start(self):
        self.thread = threading.Thread(target = self.target)
        self.thread.start()


if __name__ == '__main__':
    
     #スレッド処理のインスタンス生成
    r = Receive()


    def startEvent(event):#スタートボタン押下時の処理
        r.ROOP = True
        r.start()

    
    def changeEvent(event):#接続変更ボタン押下時の処理
        r.num = r.num + 1
 

    
    def finishEvent(event):# 終了ボタン押下処理
        print("終了しました")
        r.ROOP = False #ループ停止 -> 自動的にスレッド破棄
        window.close() #ウインドウを消す
        sys.exit() #アプリ終了
    


    #ウインドウの表示、設定
    sg.theme('BluePurple')
    layout = [[sg.Text('処理の実行、変更、停止を行います:'),sg.Text(size=(15,1), key='-OUTPUT-')], [sg.Button('Start'), sg.Button('Change'),sg.Button('Stop')]]
    window = sg.Window('Pattern 2B', layout)

    while True:

        event , values = window.read()
        print(event, values)
        
        
        #ボタンの処理内容
        if event == 'Start':
            window['-OUTPUT-'].update('実行中')
            startEvent(event)
        
        if event=='Change':
            window['-OUTPUT-'].update('変更しました')
            changeEvent(event)

        #Stopまたは閉じるで終了
        if event in  ('Stop', None):
            finishEvent(event)

GUI部分の解説

表示部分は公式cookbookのPattern 2Bを採用しています。

テーマやボタンが豊富なのでレイアウトも変えやすいです。

ダブルクリックで実行できるようにする(Mac編)

ターミナルに下のプログラムを入力し実行します。

pip install pyinstaller

私の環境ではうまくいかなかったため、

pip3 install pyinstaller

でpyinstallerをインストールしました。

インストールできたら、そのままターミナルで次のプログラムを入力し実行します。

pyinstaller ファイル名.py --onefile

4種類のファイル(フォルダ)が作成されました

distの中に入っているファイルをダブルクリックでプログラムが動きます。

参考URL

Pythonスクリプトを単一実行ファイルにする方法 - Qiita
はじめに Pythonを配布しやすいように、実行可能形式で配布できたらいいのに…ということで、今回は、pythonスクリプトを単一の実行可能形式にする方法を解説します。 あくまで、覚書ですので、参考までにどうぞ。 インストー...