PyQt5 - 自动化串行模块
Posted
技术标签:
【中文标题】PyQt5 - 自动化串行模块【英文标题】:PyQt5 - Automate Serial module 【发布时间】:2017-11-11 22:17:29 【问题描述】:我正在尝试在不单击按钮的情况下自动进行串行连接。当gui加载时,应立即读取serial并间隔刷新,而不使用鼠标触发任何按钮(即自动读取和更新)。
这怎么可能?请参阅下面的脚本和 GUI..
import schedule
import serial
import sys
from PyQt5 import uic, QtWidgets
qtCreatorFile = "gui.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
estudiantes = [' ',' ',' ',' ']
ser = serial.Serial('COM9', baudrate=9600, timeout=1)
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
Ui_MainWindow.__init__(self)
self.setupUi(self)
self.Boton.clicked.connect(self.ingresos)
#self.ingresos()
def ingresos(self):
dato = ser.readline().decode('ascii')
#datos = (self.Box4.toPlainText())
#dato = str(datos)
estudiantes.insert(0,dato)
estudiantes.pop()
self.Box1.setText(estudiantes[0])
self.Box2.setText(estudiantes[1])
self.Box3.setText(estudiantes[2])
self.Box4.setText(estudiantes[3])
#self.Box1.setText("estudiantes")
# =============================================
def job():
# print("I'm working...")
dato = ser.readline().decode('ascii')
#datos = (self.Box4.toPlainText())
#dato = str(datos)
estudiantes.insert(0,dato)
estudiantes.pop()
self.Box1.setText(estudiantes[0])
self.Box2.setText(estudiantes[1])
self.Box3.setText(estudiantes[2])
self.Box4.setText(estudiantes[3])
#self.Box1.setText("estudiantes")
# .......................
schedule.every(0.05).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
# .... Time definition ....
# 0.05 = 05 Seconds
# 0.50 = 50 Seconds
# 5.00 = 05 Minutes
# =============================================
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
PyQt5 GUI .ui 文件是HERE....
【问题讨论】:
【参考方案1】:Qt 的一个基本规则是 GUI 不应该从主线程以外的线程更新,这称为 GUI 线程。有几种选择,例如通过信号将数据发送到主线程,或者使用QRunnable
和QThreadPool
,如下所示:
代码:
qtCreatorFile = "gui.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)
estudiantes = [' ',' ',' ',' ']
class SerialRunnable(QtCore.QRunnable):
def __init__(self, w):
QtCore.QRunnable.__init__(self)
self.w = w
self.ser = serial.Serial('COM9', baudrate=9600, timeout=1)
def run(self):
while True:
dato = self.ser.readline().decode('ascii')
if dato != "":
QtCore.QMetaObject.invokeMethod(self.w, "setValues",
QtCore.Qt.QueuedConnection,
QtCore.Q_ARG(str, dato))
QtCore.QThread.msleep(10)
class MyApp(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
QtWidgets.QMainWindow.__init__(self)
self.setupUi(self)
runnable = SerialRunnable(self)
QtCore.QThreadPool.globalInstance().start(runnable)
@QtCore.pyqtSlot(str)
def setValues(self, dato):
estudiantes.insert(0,dato)
estudiantes.pop()
self.Box1.setText(estudiantes[0])
self.Box2.setText(estudiantes[1])
self.Box3.setText(estudiantes[2])
self.Box4.setText(estudiantes[3])
【讨论】:
非常接近。只是它一次只使用两个盒子而不是四个盒子。我该如何解决? @userPyGeo 我已经修改了代码,现在试试。您多久发送一次数据?以上是关于PyQt5 - 自动化串行模块的主要内容,如果未能解决你的问题,请参考以下文章
Python pyinstaller没有自动将依赖库打包进去,运行时提示找不到模块ModuleNotFoundError: No module named ‘PyQt5‘