我正在使用 Python、PyQt5、QThread。 İ 有 GUİ 显示来自传感器的注册对象。连接方案——传感器+Arduino+PC。
import serial
import glob
import datetime
# from serial import Serial
import sys
from PyQt5.QtWidgets import (QDialog, QApplication, QWidget, QPushButton,
QComboBox, QVBoxLayout, QCheckBox, QLCDNumber,
QSlider, QProgressBar, QHBoxLayout, QLabel)
from PyQt5 import QtCore
from PyQt5.QtCore import QThread, pyqtSignal, QTimer
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt
timespan = 10000
load = [0] * timespan
production = [0] * timespan
pdc = [0] * timespan
class WorkerThread(QThread):
# mysignal_i=pyqtSignal( int, name='Signal_i') ### 1) declare the signal
measurements_signals = pyqtSignal(int, float, name='m_signals')
def __init__(self, parent=None):
QThread.__init__(self)
def run(self):
print('reading')
a = 100 #
fq = [0] * a
tot = 0
sum = 0
v = 0.0
ser = serial.Serial(
port='COM4', # use "dmesg | grep tty" to find out the port
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE
)
while ser.isOpen():
c = ser.readline().decode('ASCII')
if c == '':
pass
else:
i = int(c)
sum -= fq[0]
for j in range(1, a):
fq[j - 1] = fq[j]
tot += i
fq[a - 1] = i * 10
sum += fq[a - 1]
v = float(sum) / a
self.measurements_signals.emit(int(tot), float(v))
ser.close()
def pause(self):
self.sleep(10)
print('sleep')
def stop(self):
# self.ser.close()
self.terminate()
print("stop")
class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
self.setGeometry(100, 100, 300, 200) # pos pos width height
self.PortLabel = QLabel("Port:")
self.LabelProd = QLabel("Total:")
self.LabelLoad = QLabel("Frequency:")
port_selectBox = QComboBox(self)
ports = self.available_serial_ports()
for port in ports:
port_selectBox.addItem(port)
self.buttonConnect = QPushButton('Start')
self.buttonPause = QPushButton('Pause')
self.buttonStop = QPushButton('Stop')
self.lcdProd = QLCDNumber(self)
self.lcdLoad = QLCDNumber(self)
self.lcdProd.setFixedHeight(100)
self.lcdLoad.setFixedHeight(100)
self.figure_timeseries = plt.figure()
self.canvas_timeseries = FigureCanvas(self.figure_timeseries)
# --------------------------- Layout
col1 = QVBoxLayout()
col1.addWidget(self.PortLabel)
col1.addWidget(port_selectBox)
col1.addWidget(self.buttonConnect)
col1.addWidget(self.buttonPause)
col1.addWidget(self.buttonStop)
col2 = QVBoxLayout()
col2.addWidget(self.LabelProd)
col2.addWidget(self.lcdProd)
col2.addWidget(self.LabelLoad)
col2.addWidget(self.lcdLoad)
toprow = QHBoxLayout()
toprow.addLayout(col1)
toprow.addLayout(col2)
layout = QVBoxLayout()
layout.addLayout(toprow)
layout.addWidget(self.canvas_timeseries)
self.setLayout(layout)
# --------------------------------------
self.wt = WorkerThread() # This is the thread object
self.buttonConnect.clicked.connect(self.wt.start)
# Connect the signal from the thread to the slot_method
self.wt.measurements_signals.connect(self.slot_method) ### 3) connect to the slot
self.buttonPause.clicked.connect(self.wt.pause)
self.buttonStop.clicked.connect(self.wt.stop)
timespan = 600
load = [0] * timespan
production = [550] * timespan
pdc = [0] * timespan
def slot_method(self, p, l):
print("p =", p)
print('l =', l)
self.lcdProd.display(p)
self.lcdLoad.display(l)
self.update_chart_timeseries(p, l)
def update_chart_timeseries(self, produzione, carico): # time series
# load.pop(0)
# load.append(carico)
production.pop(0)
production.append(produzione)
self.figure_timeseries.clear()
plt.figure(num=self.figure_timeseries.number)
plt.plot(production, color="b")
# plt.plot(load, color="r")
# plt.set_ylim([0,max(load, production)])
plt.ylim(ymin=0)
plt.legend(['PV'], loc='upper left')
self.canvas_timeseries.draw()
def available_serial_ports(self):
ports = ['COM%s' % (i + 1) for i in range(256)]
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())
但我正在尝试暂停和恢复线程。我希望当我单击按钮暂停时,注册将停止,单击开始后注册将继续。 例如:在点击 reg obj: 56 之前点击 start 之后将继续 56+..... 我尝试使用 wait() 和 sleep() QThread 函数,但它无法正常工作。