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 线程。有几种选择,例如通过信号将数据发送到主线程,或者使用QRunnableQThreadPool,如下所示:

代码:

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‘

如何使用串行向我的 PyQt5 窗口添加实时(更新)图?

pyQt5 滚动条自动跟随

如何在从串口python pyqt接收的textbrowser pyqt5上附加串行数据[重复]

使用 PyQt5,实现两个窗口自动永远循环

pyqt5 qwebenginview 不会自动播放 youtube 视频