質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5366閲覧

wxpythonにおいてスレッド間のデータ受け渡しについて

koutaku1108

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/15 16:39

前提・実現したいこと

現在pythonを用いてセンサーの情報によって人の動きを検知するシステムを作っています.
そのためwxpythonでスレッドを用いてGUIを表示するクラスとセンサーのデータをリアルタイムで受け取るクラスを並列で動かして,センサーデータによってGUIのテキストの表示を変えることを目的としています.

発生している問題・エラーメッセージ

初歩的な問題で申し訳ないのですが,class:sensorで作った値iをclass:GUIにおくってそのiの値によってtext1のラベルが自動で変わっていくために,どのモジュールやメソッドを用いればよいのかが日本語の文献は乏しく,英語の文献ではコードが長すぎてどの部分がスレッド間の通信を行っているのかがわからなかったです.

該当のソースコード

python

1import smtplib 2from email.mime.text import MIMEText 3import wx 4import time 5from threading import Thread 6 7#表示メインフレーム 8class GUI: 9 def __init__(self): 10 self.application = wx.App() 11 self.frame = wx.Frame(None, wx.ID_ANY, 'TOTO', size=(300, 200)) 12 self.frame.Center() 13 self.frame.SetBackgroundColour('#FFFFFF') 14 15 #パネル 16 self.display= wx.Panel(self.frame, wx.ID_ANY,size=(300,100),pos=(0,0)) 17 self.display.SetBackgroundColour('#FFFAF0') 18 self.status='vacant' 19 self.text1=wx.StaticText(self.display,wx.ID_ANY,self.status) 20 font=wx.Font(20,wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) 21 self.text1.SetFont(font) 22 self.text1.Center() 23 24 self.reservation=wx.Panel(self.frame,wx.ID_ANY,size=(300,100),pos=(0,100)) 25 self.button_1 = wx.Button(self.reservation, wx.ID_ANY, 'reserve',size=(100,50)) 26 self.button_1.SetFont(font) 27 self.button_1.Bind(wx.EVT_BUTTON,self.click) 28 self.frame.Show() 29 self.application.MainLoop() 30 31 def click(self,event): 32 if self.status=='vacant': 33 self.text1.SetLabel('reserved') 34 self.button_1.Disable() 35 36#データ受け渡し 37class sensor(Thread): 38 def __init__(self): 39 Thread.__init__(self) 40 self.setDaemon(True) 41 self.start() 42 43 def run(self): 44 self.i=0 45 while 1: 46 self.i=self.i+1 47 time.sleep(1) 48 print(self.i) 49 50sensor=sensor() 51GUI=GUI()

試したこと

pubsubによるsendMessage
PostEvent
ともにサンプルのコードのどこを変えれば自分のプログラムにあてはめられるのかわかりませんでした.

補足情報(FW/ツールのバージョンなど)

IDE Pycharm
python 3.4

wxpython
threading.Thread

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自分で解決できたので何かと参考になればと思い書き残しておきます.
wx.lib.neweventを用いて自分でイベントを作成し別のスレッドからPostEventを作成し解決しました!
コードを残しておくのでよかったら参考にしてください.

python

1import smtplib 2from email.mime.text import MIMEText 3import time 4import _thread 5import wx 6import wx.lib.newevent 7import queue 8 9 10q = queue.Queue(1) 11# 新しいイベントクラスとイベントを定義する 12(MyThreadEvent, EVT_MY_THREAD) = wx.lib.newevent.NewEvent() 13class MyThread: 14 def __init__(self, win): 15 self.win = win 16 self.i=0 17 def Start(self): 18 self.keepGoing = True 19 self.running = True 20 _thread.start_new_thread(self.Run, ()) 21 def Stop(self): 22 self.keepGoing = False 23 def IsRunning(self): 24 return self.running 25 def Run(self): 26 while self.keepGoing: 27 # メッセージを格納したイベントを作る 28 #データ受信 29 30 self.i=self.i+1 31 print(self.i) 32 evt = MyThreadEvent(msg=self.i) 33 34 35 # イベントを投げる 36 wx.PostEvent(self.win, evt) 37 time.sleep(1) 38 39 self.running = False 40 41class dataserver: 42 def Start(self): 43 _thread.start_new_thread(self.Run, ()) 44 def Run(self): 45 self.lock=q.get() 46 print(self.lock) 47 48 49class MainWindow(wx.Frame): 50 def __init__(self, parent, id, title): 51 wx.Frame.__init__(self, parent, id, title, size=(300, 200)) 52 self.Center() 53 54 # パネル 55 self.display = wx.Panel(self, size=(300, 100), pos=(0, 0)) 56 self.display.SetBackgroundColour('#FFFAF0') 57 self.status = 'vacant' 58 59 #テキスト 60 self.text1 = wx.StaticText(self.display,id, self.status) 61 font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) 62 self.text1.SetFont(font) 63 self.text1.Center() 64 65 self.reservation = wx.Panel(self,size=(300, 100), pos=(0, 100)) 66 self.button_1 = wx.Button(self.reservation,id, 'reserve', size=(100, 50)) 67 self.button_1.SetFont(font) 68 self.button_1.Bind(wx.EVT_BUTTON, self.click) 69 70 71 # 新しく定義したイベントに対応する処理関数をバインドする 72 self.Bind(EVT_MY_THREAD, self.OnUpdate) 73 self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) 74 # スレッドのインスタンスを作り、起動する 75 self.my_thread = MyThread(self) 76 self.my_thread.Start() 77 78 self.Centre() 79 self.Show(True) 80 81 def click(self, event): 82 # mail1=mail() 83 if self.status == 'vacant': 84 self.status='reserved' 85 self.text1.SetLabel(self.status) 86 self.data=dataserver() 87 self.data.Start() 88 q.put('locked') 89 self.button_1.Disable() 90 # mail1.message() 91 92 def OnCloseWindow(self, evt): 93 # スレッドが停止するまで待ってから、ウィンドウを閉じる 94 self.my_thread.Stop() 95 96 while self.my_thread.IsRunning(): 97 time.sleep(0.1) 98 self.Destroy() 99 100 def OnUpdate(self, evt): 101 # スレッドからイベントを受信したときの処理 102 if evt.msg>10 and self.status=='vacant': 103 self.status='occupied' 104 self.text1.SetLabel(self.status) 105 106#メール送信クラス 107class mail: 108 def __init__(self): 109 self.from_address='########@gmail.com' 110 self.to_address='#######@#######' 111 self.password="#######" 112 self.account="#######@gmail.com" 113 self.subject='mailtest' 114 self.text='yahho' 115 def message(self): 116 self.msg=MIMEText(self.text) 117 self.msg['Subject']=self.subject 118 self.msg['From']=self.from_address 119 self.msg['To']=self.to_address 120 s = smtplib.SMTP("smtp.gmail.com",587) 121 s.ehlo() 122 s.starttls() 123 s.ehlo() 124 s.login(self.account,self.password) 125 s.sendmail(self.from_address, self.to_address, self.msg.as_string()) 126 s.close() 127 128 129app = wx.App() 130MainWindow(None, wx.ID_ANY, 'TOTO') 131app.MainLoop()

投稿2018/11/16 14:47

koutaku1108

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問