2016-08-24 3 views
1

Может кто-нибудь, пожалуйста, скажите мне, что не так с этим фрагментом кода.Python PYserial WxPython Threading

Когда я нажимаю кнопку 1 - все хорошо. Я хочу нажать кнопку2 - остановить процесс, запускаемый кнопкой 1, и выполнить другой процесс. Я не могу этого сделать - МОЙ GUI идет безответственно.

Вы можете редактировать последовательную связь с инструкциями PRINT, если хотите, в функциях doit и doit2.

Пожалуйста, не комментируйте, как я сделал графический интерфейс - это просто быстрый пример. Пожалуйста, прокомментируйте, почему я не могу передать pill2kill - когда я нажимаю кнопку 2. И почему мой графический интерфейс идет в безответственное состояние.

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

Thread.join будет блокировать, пока поток не прекращается. Если обработчики событий вашего GUI заблокированы и не могут вернуться в MainLoop, другие события не могут быть получены и отправлены, и поэтому приложение кажется замороженным.