日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

chart控件做实时曲线显示_用PyQt5.QtChart实现动态曲线图

發(fā)布時(shí)間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 chart控件做实时曲线显示_用PyQt5.QtChart实现动态曲线图 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前一直用爬蟲(chóng)捉取路由實(shí)時(shí)上下載的記錄用數(shù)據(jù)庫(kù)保存,有時(shí)可用matplotlib來(lái)查看時(shí)間與上下傳的曲線圖,但是靜態(tài)的,查詢的時(shí)間段需自行認(rèn)定,雖然qt的日歷類可以比較方便取日期按日期查,但總覺(jué)要點(diǎn)有點(diǎn)麻煩,又不想看24小時(shí)的數(shù)據(jù),截取最近幾小時(shí)觀看數(shù)據(jù)并實(shí)時(shí)展示應(yīng)該是很好的方式,經(jīng)百度發(fā)現(xiàn)pyqt有個(gè)很方便的庫(kù)來(lái)展示動(dòng)態(tài)數(shù)據(jù),這個(gè)庫(kù)是pyqtchart,安裝PyQt時(shí)并沒(méi)有這個(gè)庫(kù)的,需另行安裝,pip install pyqtchart安裝就可以了,下面就結(jié)合代碼和實(shí)際情況記錄一下。

import sqlite3,sys,time from datetime import datetime from PyQt5.QtChart import QDateTimeAxis,QValueAxis,QSplineSeries,QChart,QChartView from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QPainter from PyQt5.QtCore import QDateTime,Qt,QTimerclass ChartView(QChartView,QChart): #原代碼如此,繼承了兩個(gè)類,其實(shí)去掉QChart也沒(méi)影響def __init__(self, *args, **kwargs):super(ChartView, self).__init__(*args, **kwargs)self.connect = sqlite3.connect("netdata.db") #數(shù)據(jù)庫(kù),表名為t1,包括時(shí)間(年月日時(shí)分秒的方式,用sqlite的自動(dòng)時(shí)間截生成的,為方便自己看,轉(zhuǎn)成年月日,結(jié)果是個(gè)坑),下載速度,上傳速度self.resize(1500, 500)self.setRenderHint(QPainter.Antialiasing) # 抗鋸齒,注釋此行曲線很難看self.limitminute=240 #設(shè)置顯示多少分鐘內(nèi)的活動(dòng)self.maxspeed = 300 #預(yù)設(shè)y軸最大值self.chart_init()self.timer_init()def timer_init(self):#使用QTimer,2秒觸發(fā)一次,更新數(shù)據(jù)self.timer = QTimer(self)self.timer.timeout.connect(self.drawLine)self.timer.start(2000)def chart_init(self):self.chart = QChart()self.series = QSplineSeries() #這個(gè)是平滑曲線類,而QSplineSeries()是折線類,根所自己需求選用,下載數(shù)據(jù)曲線self.series_upload = QSplineSeries() #上傳數(shù)據(jù)曲線#設(shè)置曲線名稱self.series.setName("下載速度")self.series_upload.setName('上傳速度')#把曲線添加到QChart的實(shí)例中self.chart.addSeries(self.series)self.chart.addSeries(self.series_upload)#聲明并初始化X軸,Y軸self.dtaxisX = QDateTimeAxis()self.vlaxisY = QValueAxis()#設(shè)置坐標(biāo)軸顯示范圍self.dtaxisX.setMin(QDateTime.currentDateTime().addSecs(-self.limitminute*60))self.dtaxisX.setMax(QDateTime.currentDateTime().addSecs(0))self.vlaxisY.setMin(0) self.vlaxisY.setMax(self.maxspeed) #設(shè)置y軸最大值#設(shè)置X軸時(shí)間樣式self.dtaxisX.setFormat("hh:mm") #關(guān)注就是幾小時(shí)內(nèi)的數(shù)據(jù),就留時(shí)分好了#設(shè)置坐標(biāo)軸上的格點(diǎn)self.dtaxisX.setTickCount(15) #平均分的刻度分隔self.vlaxisY.setTickCount(10)#設(shè)置坐標(biāo)軸名稱self.dtaxisX.setTitleText("時(shí)間")self.vlaxisY.setTitleText("速度(M)")#設(shè)置網(wǎng)格顯示,并設(shè)為灰色 self.vlaxisY.setGridLineVisible(True)self.vlaxisY.setGridLineColor(Qt.gray)self.dtaxisX.setGridLineVisible(True)self.dtaxisX.setGridLineColor(Qt.gray)#把坐標(biāo)軸添加到chart中self.chart.addAxis(self.dtaxisX,Qt.AlignBottom)self.chart.addAxis(self.vlaxisY,Qt.AlignLeft)#把曲線關(guān)聯(lián)到坐標(biāo)軸self.series.attachAxis(self.dtaxisX)self.series.attachAxis(self.vlaxisY)self.series_upload.attachAxis(self.dtaxisX)self.series_upload.attachAxis(self.vlaxisY)self.setChart(self.chart)def drawLine(self):#獲取當(dāng)前時(shí)間bjtime = QDateTime.currentDateTime()#更新X軸坐標(biāo)self.dtaxisX.setMin(bjtime.addSecs(-self.limitminute*60))self.dtaxisX.setMax(bjtime.addSecs(0))#設(shè)Y軸最大值,查詢數(shù)據(jù)庫(kù)最近4小時(shí)內(nèi)的下載最大值,并乘1.2作為y軸最大值for xx in self.connect.execute("select max(downdata) from t1 where time > datetime('now','-4 hour','localtime') order by time"):if xx:self.vlaxisY.setMax(int(xx[0] * 1.2))else:self.vlaxisY.setMax(self.maxspeed)if self.series.at(0): #self.serie存在索引0時(shí),也就是起碼有一個(gè)數(shù)據(jù)對(duì)過(guò)舊數(shù)據(jù)進(jìn)行清除,self.series.removePoints兩參數(shù)一個(gè)是索引,一個(gè)是從索引起始刪除多少個(gè)數(shù)值,兩條數(shù)據(jù)均如此處理if self.series.at(0).x()<bjtime.addSecs(-self.limitminute*60).toMSecsSinceEpoch(): #self.series.at(0).x()其實(shí)就是圖像x坐標(biāo)值,與原始數(shù)據(jù)可能并不完全相等,小數(shù)點(diǎn)后的值是約去了的,bjtime的toMSecsSinceEpoch()其實(shí)與time.time()相約,不過(guò)前者是整數(shù),是后者的1000倍,所以后面需要轉(zhuǎn)換self.series.removePoints(0, 1)if self.series_upload.at(0):if self.series_upload.at(0).x()<bjtime.addSecs(-self.limitminute*60).toMSecsSinceEpoch():self.series_upload.removePoints(0, 1)for xx in self.connect.execute("select * from t1 order by time desc limit 1"):#x1 = self.connect.execute("select strftime('%s',?)", (xx[0],)).fetchone()[0] #用此法轉(zhuǎn)出來(lái)的時(shí)間截與time.time()整好差8個(gè)時(shí)區(qū),用sqlite不知如何處理了x1=time.mktime(datetime.strptime(xx[0], '%Y-%m-%d %H:%M:%S').timetuple()) #用py內(nèi)置庫(kù)的辦法有日期轉(zhuǎn)為時(shí)間截x_time=int(x1)*1000 #再乘1000,以符號(hào)格式要求y0_value=xx[1] #取得下載數(shù)據(jù)y1_value=xx[2] #取得上傳數(shù)據(jù)#添加數(shù)據(jù)到曲線末端if self.series.at(0): #因數(shù)據(jù)庫(kù)并非每秒更新,為免相同數(shù)據(jù)重復(fù)錄入,先判斷self.series起碼有一個(gè)數(shù)據(jù)if x_time!=self.series.at(self.series.count()-1).x(): #假如最新的時(shí)間軸與數(shù)據(jù)庫(kù)取得的不一致就錄入,相同就跳過(guò)self.series.append(x_time, y0_value)else: #當(dāng)self.series為空時(shí)起碼錄入第一個(gè)數(shù)據(jù),下面另外一軸同樣處理self.series.append(x_time,y0_value)if self.series_upload.at(0):if x_time!=self.series_upload.at(self.series_upload.count()-1).x():self.series_upload.append(x_time, y1_value)else:self.series_upload.append(x_time,y1_value)#print(self.series.count(),self.series_upload.count())if __name__ == "__main__":app = QApplication(sys.argv)view = ChartView()view.show()sys.exit(app.exec_())

下面上張效果圖

不過(guò)這個(gè)標(biāo)題到底是怎么改的?沒(méi)找到什么方法

總結(jié)

以上是生活随笔為你收集整理的chart控件做实时曲线显示_用PyQt5.QtChart实现动态曲线图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 电家庭影院午夜 | 色婷婷av一区二区三区大白胸 | 日韩亚洲影院 | 在线观看亚洲精品视频 | 鸥美毛片 | 一本久道久久综合无码中文 | 欧美视频色 | 亚洲精品aⅴ | 国产成人av片 | 亚洲天堂日韩在线 | 欧美xxxxx牲另类人与 | 男女男精品视频站 | 美女污污网站 | 国产男女猛烈无遮挡 | 黄色片毛片| 国际av在线| 这里只有精品免费视频 | 午夜影院一区二区三区 | 日本aaa级片| 欧美视频第一页 | 在线能看的av网站 | 国产一区二区日韩 | 久久久综合av | 日韩动漫av | 比利时xxxx性hd极品 | 国产精品一区二 | 久久精品一日日躁夜夜躁 | 成人网视频 | 五月天国产视频 | 日本精品免费在线观看 | 中文字幕精品在线观看 | 日韩av一区二区三区在线观看 | 自由成熟xxxx色视频 | 久久色在线 | 亚洲视频精品在线观看 | 日韩淫视频 | 国产又黄又爽又色 | wwwxxx国产 | 38激情 | 国产人澡人澡澡澡人碰视频 | 亚洲综合在线第一页 | 伊人色图| 久久sese| 琪琪电影午夜理论片八戒八戒 | 欧美日韩一级二级三级 | 男女作爱免费网站 | 中文字幕永久视频 | 波多野结衣在线观看一区二区 | 伊人99 | 久久精品综合视频 | 999久久久精品视频 亚洲视频精品在线 | 亚洲无遮挡 | 国产视频在线观看免费 | 国产精品久久久久久婷婷天堂 | 日韩视频在线观看一区二区 | 国产欧美一区二区三区在线老狼 | 三级不卡视频 | 99riav国产在线观看 | 日韩高清中文字幕 | 中文字幕免费在线观看视频 | 亚洲av综合色区无码一区 | 9·1·黄·色·视·频 | 免费人成在线观看 | 91麻豆视频网站 | 国产手机在线播放 | 黄色www | www日韩在线 | 青青草91久久久久久久久 | 国产色视频一区二区三区qq号 | www.99在线| 欧美色精品在线 | 成人gav| 欧美顶级黄色大片免费 | 国产一区二区三区在线观看免费 | 久久久久99人妻一区二区三区 | 深夜福利网站 | jizz欧美大片 | xxxx999| 谁有毛片网址 | a√国产| 午夜伦理在线观看 | 精品福利片 | 国内自拍青青草 | 美脚の诱脚舐め脚 | 日韩国产成人 | 夜夜操导航| 夫妻淫语绿帽对白 | 好爽…又高潮了毛片免费看 | 黄色va | 日韩av一卡 | 久久手机看片 | 老熟妇仑乱一区二区av | 日本bdsm视频 | 国产成人精品在线视频 | 午夜福利一区二区三区 | 日韩精品极品视频 | 成年人免费视频网站 | xxxx亚洲 | 色av综合 |