国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【PyQt】PyQt5進階——串口上位機及實時數(shù)據(jù)顯示

這篇具有很好參考價值的文章主要介紹了【PyQt】PyQt5進階——串口上位機及實時數(shù)據(jù)顯示。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0 前期教程

  • 【Python】PyQt5入門

1 前言

??最近在用PyQt做一個串口上位機,需要串口通信和實時顯示曲線。這里簡單記錄一些關(guān)鍵點。

2 串口部分——QtSerialPort

??這個是在安裝PyQt5時自動安裝的組件,使用方法比較簡單,主要是兩個模塊:QSerialPort, QSerialPortInfo

# 導(dǎo)入包
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo

#獲取當(dāng)前的所有串口,得到一個列表
portlist = QSerialPortInfo.availablePorts()
#獲取串口的名稱和描述
l = [x.portName()+x.description() for x in self.portlist] 
#建立一個串口,里面的參數(shù)可以填串口名或者就是串口類
ser = QSerialPort()
#接收數(shù)據(jù)對應(yīng)調(diào)用的函數(shù)
ser.readyRead.connect(recv_data)

#設(shè)置串口
def init_port(self, port:QSerialPort):
	port.setBaudRate(self.baud)
	port.setDataBits(QSerialPort.DataBits.Data8)
	port.setParity(QSerialPort.Parity.NoParity)
	port.setStopBits(QSerialPort.StopBits.OneStop)
	port.readyRead.connect(recv_data)

#數(shù)據(jù)接收
data = ser.readAll().data() #得到的是字節(jié)字符串

??以上就是串口部分的代碼,比較簡單,利用代碼提示基本沒有什么問題。

關(guān)于字節(jié)字符串的處理可以看一下這篇文章

  • 【學(xué)習(xí)筆記】字節(jié)數(shù)據(jù)和字節(jié)字符串(b“ “)那些事

3 繪圖部分

??經(jīng)過調(diào)研,發(fā)現(xiàn)在Qt當(dāng)中繪制函數(shù)曲線,常用的有3個包,分別是QCustomPlot , QWTQtChart,其中前兩者都是第三方包,后者是Qt官方做的,不過三者都兼容PyQt5就是了

3.1 QCustomPlot

??QCustomPlot目前在pypi上好像有好幾個版本

pyqt5串口上位機,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

除此之外,如果直接運行pip install QCustomPlot2也是可以安裝的,而且用著感覺和QCustomPlot-PyQt5沒什么區(qū)別,所以也不知道啥有這么多的版本。

??不過這個包有一個最大的問題,那就是它對Python的支持不夠好。網(wǎng)上有很多關(guān)于這個包在C環(huán)境下的使用,但是Python環(huán)境下卻不支持代碼提示,安裝的包是一個編譯過的pyd文件。

??以下是一個例子

import sys
import math
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPen, QBrush, QColor
from PyQt5.QtWidgets import QApplication, QMainWindow

from QCustomPlot2 import QCustomPlot, QCP
#以上QCustomPlot2完全可以直接換成QCustomPlot-PyQt5

app = QApplication(sys.argv)
window = QMainWindow()
window.resize(800, 600)

customPlot = QCustomPlot()
window.setCentralWidget(customPlot)

graph0 = customPlot.addGraph()
graph0.setPen(QPen(Qt.blue))
graph0.setBrush(QBrush(QColor(0, 0, 255, 20)))

graph1 = customPlot.addGraph()
graph1.setPen(QPen(Qt.red))

x, y0, y1 = [], [], []
for i in range (251):
    x.append(i)
    y0.append(math.exp(-i/150.0)*math.cos(i/10.0))  # exponentially decaying cosine
    y1.append(math.exp(-i/150.0))                   # exponential envelope

graph0.setData(x, y0)
graph1.setData(x, y1) #除setData外,還有addData函數(shù),即添加一個點

customPlot.rescaleAxes()
customPlot.setInteraction(QCP.iRangeDrag)
customPlot.setInteraction(QCP.iRangeZoom)
customPlot.setInteraction(QCP.iSelectPlottables)

window.show()
sys.exit(app.exec_())

以下是在類中的使用參考:

def initPlot(self):
    self.ui.widget

    self.ui.widget.setInteractions(QCP.iRangeDrag | QCP.iRangeZoom | QCP.iSelectAxes | QCP.iSelectLegend | QCP.iSelectPlottables)
    # self.ui.widget.axisRect().setRangeZoomAxes(, self.ui.widget.yAxis)
    self.ui.widget.xAxis.setLabel("t")
    self.ui.widget.yAxis.setLabel("accel")
    self.ui.widget.legend.setVisible(True)
    self.ui.widget.yAxis.setRange(-2,2)

    self.ui.widget.axisRect().insetLayout().setInsetAlignment(0, Qt.AlignLeft|Qt.AlignTop)

    self.ui.widget.addGraph()#添加第1條曲線
    self.ui.widget.graph(0).setName("x")#曲線名稱
    self.ui.widget.graph(0).setPen(QPen(Qt.red)) # line1 color red for second graph

    self.ui.widget.addGraph()#添加第2條曲線
    self.ui.widget.graph(1).setName("y")#曲線名稱
    self.ui.widget.graph(1).setPen(QPen(Qt.blue)) # line1 color red for second graph

    self.ui.widget.addGraph()#添加第3條曲線
    self.ui.widget.graph(2).setName("z")#曲線名稱
    self.ui.widget.graph(2).setPen(QPen(Qt.green)) # line1 color red for second graph

    self.ui.widget.addGraph()#添加第4條曲線
    self.ui.widget.graph(3).setName("norm")#曲線名稱
    self.ui.widget.graph(3).setPen(QPen(Qt.cyan)) # line1 color red for second graph

    self.key_init = QDateTime.currentDateTime().toMSecsSinceEpoch()/1000

def fresh(self, x=0, y=0, z=0, norm=0):
    key = QDateTime.currentDateTime().toMSecsSinceEpoch()/1000 - self.key_init
    self.ui.widget.graph(0).addData(key, x)
    self.ui.widget.graph(1).addData(key, y)
    self.ui.widget.graph(2).addData(key, z)
    self.ui.widget.graph(3).addData(key, norm)
    self.ui.widget.rescaleAxes()

    # self.ui.widget.xAxis.setRange(self.x, 8, Qt.AlignRight)
    self.ui.widget.replot()

3.2 QtChart

??使用前先安裝:pip install PyQtChart,在使用這個包時,要注意其基本的邏輯。顯示的類為QChartView, 但是QChartView需要關(guān)聯(lián)一個QChart,而每個QChart可以包含一個或多個series,即一條或多條曲線,當(dāng)然series類型有很多,這個和曲線計算方式和想要繪制圖形的類型有關(guān)。看個例子。

import sys
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
from PyQt5.QtChart import QLineSeries, QChart, QChartView
def create_chart():
    # 創(chuàng)建折線圖的數(shù)據(jù)
    series = QLineSeries()
    series.append(0, 0)
    series.append(1, 1)
    series.append(2, 2)
    series.append(3, 3)
    chart = QChart()
    chart.addSeries(series)
    chart.setTitle('Chart Example') # 設(shè)置圖表標(biāo)題
    chart.setAnimationOptions(QChart.SeriesAnimations) # 設(shè)置動畫效果
    return chart
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle('QtChart Example')
        chart_view = QChartView(create_chart())

        chart_view.setRenderHint(QPainter.Antialiasing) # 設(shè)置渲染方式
        self.setCentralWidget(chart_view)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

//2023.5.16
這個有一點需要注意的是,序列,坐標(biāo)系,圖表的建立要遵循一定的順序,具體可以參考這篇博客中的代碼。

3.3 QWT

??這個沒有用過,但是感覺還行,也有代碼提示,安裝方法:

# 一定要安裝這個包,否則無法使用
pip install pyqt5-tools
# 再安裝對應(yīng)的包
pip install PythonQwt

這里給一個pypi官網(wǎng)提供的例子:

from qtpy import QtWidgets as QW
import qwt
import numpy as np

app = QW.QApplication([])
x = np.linspace(-10, 10, 500)
plot = qwt.QwtPlot("Trigonometric functions")
plot.insertLegend(qwt.QwtLegend(), qwt.QwtPlot.BottomLegend)
qwt.QwtPlotCurve.make(x, np.cos(x), "Cosinus", plot, linecolor="red", antialiased=True)
qwt.QwtPlotCurve.make(x, np.sin(x), "Sinus", plot, linecolor="blue", antialiased=True)
plot.resize(600, 300)
plot.show()
app.exec_()

3.4 Qt Designer中如何使用

??在上面的前期教程當(dāng)中,有提到PyQt常用的開發(fā)方式,就是在Qt Designer中設(shè)計ui,然后轉(zhuǎn)換成py文件,再另寫一個py文件進行界面的顯示和處理。那這些曲線怎么在Qt Designer中設(shè)計呢?

??在需要顯示的位置放置一個Widget控件:

pyqt5串口上位機,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

然后右鍵該控件,選擇“提升為”

pyqt5串口上位機,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

pyqt5串口上位機,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

這里主要是填兩個空,即提升的類名稱和頭文件,由于Python當(dāng)中沒有頭文件,實際填的是模塊名。即保證結(jié)構(gòu)是from B import A,其中A應(yīng)該是一個顯示的類,具體應(yīng)該填什么根據(jù)使用的包決定。比如如果使用的是QtChart,那么應(yīng)該是from PyQt5.QtChart import QChartView文章來源地址http://www.zghlxwxcb.cn/news/detail-528747.html

參考鏈接

  • PyQt5 QSerialPort子線程操作
  • Python3+PyQt5+QtChart 實現(xiàn)簡單的實時更新曲線圖
  • QChart的簡單使用
  • Qwt、QChart、QCustomPlot使用
  • PyQtChart

到了這里,關(guān)于【PyQt】PyQt5進階——串口上位機及實時數(shù)據(jù)顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Python進階-PyQt5】00搭建PyQt5環(huán)境

    【Python進階-PyQt5】00搭建PyQt5環(huán)境

    我們編寫的程序,有時用到的Python庫是不一樣的,比如說開發(fā)桌面應(yīng)用程序我們主要用到PyQt5相關(guān)的Python庫、開發(fā)Web應(yīng)用程序我們主要用到Django相關(guān)的Python庫等等。假設(shè)我們在開發(fā)桌面應(yīng)用程序的時候除了PyQt5相關(guān)的Python庫外,還附加了其他的Python庫,比如有關(guān)Django的Python庫。

    2024年02月08日
    瀏覽(23)
  • QT串口調(diào)試助手開發(fā)教程:上位機接收數(shù)據(jù)解析數(shù)據(jù)幀+多通道波形顯示+數(shù)據(jù)保存

    QT串口調(diào)試助手開發(fā)教程:上位機接收數(shù)據(jù)解析數(shù)據(jù)幀+多通道波形顯示+數(shù)據(jù)保存

    在該設(shè)計中主要需要解決的問題就是接收單片機采集到的數(shù)據(jù)并在上位機將數(shù)字實時的通過波形顯示出來,然后上位機要有保存下數(shù)據(jù)文件的功能,便于后續(xù)的軟件讀取數(shù)據(jù)做進一步的分析處理。有些人吃相難看,無底線,無道德,鑒于串口上位機會被廣泛使用,撰寫該教程

    2024年02月07日
    瀏覽(24)
  • 制作一個串口助手 | python + pyqt5

    制作一個串口助手 | python + pyqt5

    目錄 一、背景 1.1、開發(fā)流程圖 二、前提 2.1、關(guān)于環(huán)境 2.2、關(guān)于源碼 三、步驟 3.1、使用pyqt創(chuàng)建一個.ui界面并生成.py文件 3.2、創(chuàng)建兩個.py文件,一個用來繼承ui界面生成的.py類,一個用來實現(xiàn)各種功能 3.3、各個功能代碼 3.3.1、打開串口 3.3.2、關(guān)閉串口 3.3.3、獲取串口號 3.

    2024年02月05日
    瀏覽(27)
  • 基于Pyqt5+serial的串口電池監(jiān)測工具

    基于Pyqt5+serial的串口電池監(jiān)測工具

    本章,其他的沒有,廢話沒有,介紹一下新開源了一個公司的測試工具,寫了差不多三周吧。先來看看界面: 這是一個串口調(diào)試界面,使用Pyqt5+serial完成。升級功能暫未移入,占一個坑位。 基于serial二次開發(fā)的功能各位如有需要可以照搬走,這是一個純手寫的輪子,穩(wěn)定!

    2024年02月14日
    瀏覽(25)
  • PyQt5簡單讀取&顯示圖片的應(yīng)用

    PyQt5簡單讀取&顯示圖片的應(yīng)用

    前言 本文為PyQt5入門教程,具體為以下四步驟 一、程序界面簡單設(shè)計 二、通過下拉列表框讀取讀取指定路徑的圖片 三、通過讀取到的圖片顯示在界面上 四、退出事件 最終效果如下: ? ? 程序初始構(gòu)成如下 在 init_ui內(nèi)開始界面布局(注:分辨率為1920 × 1080)? 結(jié)果應(yīng)為 ?注

    2024年02月02日
    瀏覽(15)
  • PyQt5學(xué)習(xí)筆記--攝像頭實時視頻展示、多線程處理、視頻編解碼

    PyQt5學(xué)習(xí)筆記--攝像頭實時視頻展示、多線程處理、視頻編解碼

    目錄 1--前言 2--基于Qt Designer設(shè)計ui文件 3--視頻的編解碼操作 4--完整代碼 5--結(jié)果展示 6--存在的問題 7--參考 ① 創(chuàng)建兩個線程, 主線程 為ui線程, 子線程 用于讀取攝像頭視頻,將處理后的圖像幀數(shù)據(jù)(處理操作可以人為添加)返回到主線程進行可視化; ② 子線程向主線程傳

    2023年04月09日
    瀏覽(42)
  • PyQt5 視頻播放--在QVideoWidget上顯示視頻

    PyQt5 視頻播放--在QVideoWidget上顯示視頻

    1、功能概述 (1)QMediaPlayer不僅可以播放音頻文件,還可以播放wmv、avi等視頻文件。 2、主要函數(shù) (1)setMedia(QMediaContent):指定一個媒體資源; (2)setPlaylist():指定一個播放列表; (3)setVideoOutput(QVideoWidget):指定一個界面組件用于視頻顯示; 重構(gòu)參數(shù): setVideoOutput(self

    2024年02月01日
    瀏覽(16)
  • PyQt5組件之QLabel顯示圖像和視頻

    PyQt5組件之QLabel顯示圖像和視頻

    目錄 一、顯示圖像和視頻 1、顯示圖像? 2、顯示視頻 二、QtDesigner?窗口簡單介紹 三、相關(guān)函數(shù) 1、打開本地圖片 2、保存圖片到本地 3、打開文件夾 4、打開本地文本文件并顯示 5、保存文本到本地 6、關(guān)聯(lián)函數(shù) 7、圖片 “.png” | “.jpn” Label 自適應(yīng)顯示 8、QLabel常用方法 1、顯

    2024年02月13日
    瀏覽(18)
  • PyQt5按下按鍵選擇文件并顯示路徑

    一、可直接運行代碼 二、函數(shù)解釋 fileName是文件的絕對路徑,fileType是文件類型 第一個參數(shù)parent,用于指定父組件,一般是一個窗口,在這個窗口建立選擇文件的對話框。這里是None。 第二個參數(shù)caption,定義這個選擇文件的對話框的標(biāo)題。 第三個參數(shù)dir,是對話框顯示時默認(rèn)

    2024年02月11日
    瀏覽(21)
  • 【pyqt5界面化工具開發(fā)-11】界面化顯示檢測信息

    【pyqt5界面化工具開發(fā)-11】界面化顯示檢測信息

    目錄 0x00 前言: 一、布局的設(shè)置 二、消息的顯示 我們在10講的基礎(chǔ)上,需要將其輸出到界面上 思路: 1、消息的傳遞 2、布局的設(shè)置 先考慮好消息的傳遞,再來完善布局 其實先完善布局,再來設(shè)置消息的傳遞也行 (我不是中國人,就是外國人) 將布局設(shè)置好以后,我們就

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包