Uca

(Python) スレッドを実行、変更、終了するGUIアプリのサンプル

概要

f:id:M_Atelier:20180719002000p:plain

  • スクリプトを実行するとウィンドウが開きます
  • ウインドウの「スレッドのスタート」ボタンでスレッドが開始されます。サンプルとして1秒毎にprint文で番号を実行するようにしています。
  • ウインドウの「処理内容変更」ボタンでスレッドの処理内容を変更します。ここでは、printする番号に+1しています。
  • ウインドウの「アプリ終了」ボタンで、スレッドを破棄してアプリを終了します。
  • GUIにはtkinter を使っています。
  • 動作確認環境:PyCharm CE 2018.1.4

 

 基本無限ループで処理をしたいんだけど、途中で処理内容を変更したり、途中で止めたい場合に、ご参考までに。
Arduinoraspberry piでLEDを光らせる他、通信確認用のパソコン側にお使いください。


※注意
 勉強中の身ですので、コードの効率悪かったり、正式な使い方をしていない、間違いがあるかもしれません。もしご使用される場合、とりあえず動かしたい時用にお願いします。Pythonの標準機能を用いずに、スレッドを終了させています。標準機能で何故か動かない場合などにどうぞです。

 

プログラム

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

 

import time
import threading
import sys
import tkinter

 

#スレッド処理のクラス
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__':
    #ウインドウ本体の設定
    root = tkinter.Tk()
    root.title(u"サンプル")
    root.propagate(True)

 

    #ボタンの処理内容

    def startEvent(event):#最初の接続ボタン押下処理
        r.ROOP = True
        r.start()

 

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

 

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

 

    #ボタンの生成
    strButton = tkinter.Button(text=u'スレッドのスタート')
    strButton.bind("<Button-1>", startEvent)
    strButton.pack()

 

    chaButton = tkinter.Button(text=u'処理内容変更')
    chaButton.bind("<Button-1>", changeEvent)
    chaButton.pack()

 

    finButton = tkinter.Button(text=u'アプリ終了')
    finButton.bind("<Button-1>", finishEvent)
    finButton.pack()

 

    #スレッド処理のインスタンス生成
    r = Receive()


    #ウインドウ生成
    root.mainloop()

 

以上です~。