Python PYserial WxPython 线程

标签 python multithreading wxpython pyserial

任何人都可以告诉我这段代码有什么问题吗?

当我按下按钮 1 时 - 一切都很好。我想按按钮 2 - 停止由按钮 1 启动的进程并执行另一个进程。我无法做到这一点 - 我的 GUI 没有响应。

如果您喜欢 doit 和 doit2 函数,欢迎您使用 PRINT 语句编辑串行通信。

请不要评论我如何制作 GUI - 这只是一个简单的例子。请评论为什么当我按下按钮2时我无法通过Pill2kill。以及为什么我的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()

最佳答案

不要使用.join命令。他们正在阻塞主线程。
请参阅此问题以获取深入描述:
what is the use of join() in python threading

关于Python PYserial WxPython 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39132641/

相关文章:

python win32com outlook 2013 SendUsingAccount返回异常

python - 从数据透视表 reshape /转换 Pandas 数据框

multithreading - 从父线程终止工作线程 - MFC

python - wxpython:如何使用其他地方创建的网格填充笔记本选项卡?

python-2.7 - 如何检查是否/使用了哪个 matplotlibrc

python - 带有 python 的口音

python - pyplot x轴被排序

vb.net - 主用户界面窗口未更新控件-跨线程操作无效

vb.net - Systems.timer.timer不需要的多线程

Python:如果应用程序已经在运行,如何禁止打开它