I am rather new in GUI programming and multi-threading apps. It is just a serial port monitor which plot serial data via pyqtgraph
. There are two curves on the first plot (a
and b
) and one curve on the second plot (c
which is (a-a_prevous)/(b-b_prevous)
). How can I improve this code in general? I use Python3.5.
from PyQt4 import QtGui
from PyQt4.QtCore import QObject, pyqtSignal
import sys
import serial
import pyqtgraph
import threading
import ui_main
import numpy as np
class GraphPlotter(QtGui.QMainWindow, ui_main.Ui_GraphPlotter):
def __init__(self):
super().__init__()
pyqtgraph.setConfigOption('background', 'w')
self.a = []
self.b = []
self.c = [0]
self.flag = 'a'
self.setupUi(self)
self.plotAB.plotItem.showGrid(True, True, 0.7)
self.plotC.plotItem.showGrid(True, True, 0.7)
self.monitor = SerialMonitor()
self.monitor.bufferUpdated.connect(self.update)
self.startButton.clicked.connect(self.monitor.start)
self.stopButton.clicked.connect(self.monitor.stop)
self.clearBufferButton.clicked.connect(self.clear)
def update(self, msg):
if self.flag == 'a':
self.a.append(msg)
self.flag = 'b'
elif self.flag == 'b':
self.b.append(msg)
c = pyqtgraph.hsvColor(0.2, alpha=.5)
pen2 = pyqtgraph.mkPen(color=c, width=3)
try:
print((self.a[-1] - self.a[-2]), (self.b[-1] - self.b[-2]))
self.c.append((self.a[-1] - self.a[-2]) / (self.b[-1] - self.b[-2]))
self.plotC.plot(np.arange(len(self.c)), self.c, pen=pen2, clear=True)
except ZeroDivisionError:
print('Division by zero')
self.c.append(0)
except IndexError:
print('C is not ready')
finally:
self.flag = 'a'
for y, pen in [(self.a, (255, 0, 0)), (self.b, (0, 255, 0))]:
self.plotAB.plot(np.arange(len(y)), y, pen=pen)
def clear(self):
self.a = []
self.b = []
self.c = [0]
self.plotAB.clear()
self.plotC.clear()
class SerialMonitor(QObject):
bufferUpdated = pyqtSignal(int)
def __init__(self):
super(SerialMonitor, self).__init__()
self.running = False
self.thread = threading.Thread(target=self.serial_monitor_thread)
def start(self):
self.running = True
self.thread.start()
def stop(self):
self.running = False
def serial_monitor_thread(self):
while self.running is True:
ser = serial.Serial('/dev/ttyS0', 115200)
msg = ser.readline()
if msg:
try:
self.bufferUpdated.emit(int(msg))
except ValueError:
print('Wrong data')
else:
pass
ser.close()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
plot = GraphPlotter()
plot.show()
app.exec_()