2016-08-24 47 views
1

このコードで何が問題なのか教えてください。Python PYserial WxPythonスレッディング

ボタン1を押すと、すべてが良好です。私はbutton2を押す - ボタン1で開始されたプロセスを停止し、別のプロセスを実行したい。私はそれをすることができません - 私のGUIは無責任に行っています。

doitとdoit2の機能が好きな人は、PRINT文を使用してシリアル通信を編集できます。

GUIをどのように作成したかについてのコメントはしないでください。これは簡単な例です。なぜ私がpill2killを渡すことができないのか、私がボタン2を押したときにコメントしてください。なぜ私のGUIが無反応状態になるのでしょうか。

import threading 
import time 
import numpy as np 
import serial 
from Transmit import Write 
from Receive import Read 
import struct 
import time 
import serial.tools.list_ports 


import wx 







class windowClass(wx.Frame): 
def __init__(self, parent, title): 

    appSize_x = 1100 
    appSize_y = 800 

    super(windowClass, self).__init__(parent, title = title, style = wx.MINIMIZE_BOX | wx.SYSTEM_MENU | wx.CLOSE_BOX |wx.CAPTION, size = (appSize_x, appSize_y)) 

    self.basicGUI() 
    self.Centre() 
    self.Show() 

def basicGUI(self): 


    # Main Panel 
    panel1 = wx.Panel(self) 

    panel1.SetBackgroundColour('#D3D3D3') 

    firmware_version = wx.StaticText(panel1, -1, "RANDOM1", pos = (70, 10)) 

    firmware_version_text_control = wx.TextCtrl(panel1, -1, size = (70,25), pos = (105,40)) 

    pump_model_serial_number = wx.StaticText(panel1, -1, "RANDOM2", pos=(25, 75)) 
    pump_model_serial_number.SetBackgroundColour('yellow') 

    model = wx.StaticText(panel1, -1, "RANDOM3", pos=(110, 100)) 

    self.listbox = wx.ListBox(panel1, -1, size = (300,250), pos = (20,135)) 

    clear_history = wx.Button(panel1, -1, 'BUTTON1', size = (225,30), pos = (40, 400)) 
    clear_history.SetBackgroundColour('RED') 
    clear_history.Bind(wx.EVT_BUTTON, self.OnClearHistory) 

    clear_history2 = wx.Button(panel1, -1, 'BUTTON2', size=(225, 30), pos=(40, 500)) 
    clear_history2.SetBackgroundColour('GREEN') 
    clear_history2.Bind(wx.EVT_BUTTON, self.OnClearHistory2) 



def OnClearHistory(self, event): 

    self.pill2kill = threading.Event() 
    self.t = threading.Thread(target=self.doit, args=(self.pill2kill, "task")) 
    self.t.start() 
    self.t.join() 

def OnClearHistory2(self, event): 

    self.pill2kill.set() 

    self.t1 = threading.Thread(target=self.doit2) 
    self.t1.start() 
    time.sleep(5) 
    self.t1.join() 


def doit(self, stop_event, arg): 

    while not stop_event.wait(1): 
     print ("working on %s" % arg) 

     ser = serial.Serial(3, 115200) 
     c = ser.write('\x5A\x03\x02\x02\x02\x09') 
     print c 
     d = ser.read(7) 
     print d.encode('hex') 
     ser.close() 


    print("Stopping as you wish.") 


def doit2(self): 
    #print ("working on %s" % arg) 

    ser = serial.Serial(3, 115200) 
    c = ser.write('\x5A\x03\x02\x08\x02\x0F') # Writing to an MCU 
    print c 
    d = ser.read(7) 
    print d.encode('hex') 
    ser.close() 




def random(): 
    app = wx.App() 
    windowClass(None, title='random') 
    app.MainLoop() 

random() 

答えて

1

.joinコマンドを使用しないでください。彼らはメインスレッドをブロックしています。
は、深さの説明については、このSO質問を参照してください:スレッドが終了するまで
what is the use of join() in python threading

1

Thread.joinがブロックされます。あなたのGUIのイベントハンドラがブロックされ、MainLoopに戻ることができない場合、他のイベントは受信および送信できないため、アプリケーションはフリーズしているように見えます。

関連する問題