echarts tab切换_Python 数据可视化实战:使用 PyQt5 和 Echarts 打造股票数据看板
生活随笔
收集整理的這篇文章主要介紹了
echarts tab切换_Python 数据可视化实战:使用 PyQt5 和 Echarts 打造股票数据看板
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
月小水長(zhǎng)一個(gè)編碼者、思考者在一篇論文中,最吸引審稿人目光的莫過(guò)于枯燥的文字間精美的圖表在一份項(xiàng)目路演ppt 中,酷炫的財(cái)務(wù)報(bào)表往往是打動(dòng)投資人的最后一劑強(qiáng)心劑作為數(shù)據(jù)分析最后也是最直接的一環(huán),數(shù)據(jù)可視化的重要性不言而喻數(shù)據(jù)可視化大致可分為兩類(lèi),一類(lèi)是 excel、powerBI 這類(lèi)不需要寫(xiě)代碼的,另一類(lèi)是需要寫(xiě)代碼的;而對(duì)于 Python 來(lái)說(shuō),數(shù)據(jù)可視化框架,我個(gè)人覺(jué)得大致可以分為以下兩類(lèi)(推薦程度從高到底)
vbox.addLayout(QHBoxLayout())
vbox.addLayout(QHBoxLayout())
#?第一個(gè)參數(shù)表示?vbox?中組件的序號(hào),也就是添加順序
#?第二個(gè)參數(shù)?表示組件在?vbox?中的權(quán)重
vbox.setStretch(0,1)
vbox.setStretch(1,1)從小的方面來(lái)說(shuō),左上角和下部分的布局都是 PyQt5 中的 QtWebEngineWidgets 組件,它就像一個(gè)瀏覽器,通過(guò) QtWebEngineWidgets 調(diào)用 Echarts 中的 API,就能在 PyQt5 的界面中顯示 Echarts 各種各樣的的圖表。而右上角是一個(gè) QTabWidget 組件,為了減少代碼之間的耦合,我單獨(dú)把它寫(xiě)成一個(gè) RightTableView 類(lèi),#?-*-?coding:?utf-8?-*-
#?author:???????????inspurer(月小水長(zhǎng))
#?pc_type???????????lenovo
#?create_time:??????2019/12/18?21:54
#?file_name:????????rightview.py
#?github????????????https://github.com/inspurer
#?qq郵箱????????????2391527690@qq.com
#?微信公眾號(hào)?????????月小水長(zhǎng)(ID:?inspurer)
import?sys
from?PyQt5.QtWidgets?import?QApplication,QWidget,QVBoxLayout,QTabWidget,QLabel,QTableWidget,QAbstractItemView,QTableWidgetItem
from?PyQt5.QtCore?import?Qt
class?RightTableView(QWidget):
????def?__init__(self):
????????super().__init__()
????????self.mainLayout?=?QVBoxLayout()
????????tabWidgets?=?QTabWidget()
????????label?=?QLabel("前一日漲幅排名前十的股票詳細(xì)信息")
????????tabWidgets.addTab(label,?"漲幅排名")
????????label?=?QLabel("前一日成交量排名前十的股票詳細(xì)信息")
????????tabWidgets.addTab(label,?"成交量排名")
????????tabWidgets.currentChanged['int'].connect(self.tabClicked)???#?綁定標(biāo)簽點(diǎn)擊時(shí)的信號(hào)與槽函數(shù)
????????self.mainLayout.addWidget(tabWidgets)
????????self.tableView?=?QTableWidget()
????????self.table?=?QTableWidget(self)
????????self.table.setColumnCount(6)
????????self.table.setSelectionBehavior(QAbstractItemView.SelectRows)??#?設(shè)置表格的選取方式是行選取
????????self.table.setSelectionMode(QAbstractItemView.SingleSelection)??#?設(shè)置選取方式為單個(gè)選取
????????self.table.setHorizontalHeaderLabels(["股票代碼",?"開(kāi)盤(pán)",?"收盤(pán)",'最高','最低','成交量'])??#?設(shè)置行表頭
????????self.mainLayout.addWidget(self.table)
????????self.mainLayout.setStretch(0,1)
????????self.mainLayout.setStretch(1,12)
????????self.setLayout(self.mainLayout)
????????self.updateView()
????def?updateView(self):
????????self.table.insertRow(0)
????????stock_code?=?QTableWidgetItem("1001")
????????stock_code.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_code.setTextAlignment(Qt.AlignCenter)
????????stock_open?=?QTableWidgetItem("10.20")??
????????stock_open.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_open.setTextAlignment(Qt.AlignCenter)
????????stock_close?=?QTableWidgetItem("10.20")??
????????stock_close.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_close.setTextAlignment(Qt.AlignCenter)
????????stock_high?=?QTableWidgetItem("10.20")??
????????stock_high.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)?
????????stock_high.setTextAlignment(Qt.AlignCenter)
????????stock_low?=?QTableWidgetItem("10.20")??
????????stock_low.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_dealNum.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)?
????????stock_dealNum.setTextAlignment(Qt.AlignCenter)
????????self.table.setItem(0,?0,?stock_code)
????????self.table.setItem(0,?1,?stock_open)
????????self.table.setItem(0,?2,?stock_close)
????????self.table.setItem(0,?3,?stock_high)
????????self.table.setItem(0,?4,?stock_low)
????????self.table.setItem(0,?5,?stock_dealNum)
????def?tabClicked(self,index):
????????'''
????????tab?監(jiān)聽(tīng)事件,在此添加業(yè)務(wù)邏輯
????????'''
????????print(index)RightTableView 實(shí)現(xiàn)了 tab 的監(jiān)聽(tīng),切換不同的 tab 可根據(jù) index 展示不同的數(shù)據(jù),因此,在主模塊中初始化 RightTableView 類(lèi)的時(shí)候,應(yīng)當(dāng)給定 RightTableView 可能用到的所有數(shù)據(jù),這樣可以避免使用 Signal 信號(hào)來(lái)進(jìn)行主模塊和 RightTableView 模塊的通信。在主模塊中,通過(guò) from rightview import RightTableView即可引入 RightTableView 布局,其中 rightview 是文件名,RightTableView 是類(lèi)名,如改行代碼爆紅(實(shí)際上不影響運(yùn)行),可在項(xiàng)目上右鍵 Mark Dircectory as -> Sources Root 解決之。
#?author:???????????inspurer(月小水長(zhǎng))
#?pc_type???????????lenovo
#?create_time:??????2019/12/2?12:25
#?file_name:????????myDict.py
#?github????????????https://github.com/inspurer
#?qq郵箱????????????2391527690@qq.com
#?微信公眾號(hào)?????????月小水長(zhǎng)(ID:?inspurer)
class?AllowKeyRepeatDict():
????'''
????自定義允許鍵重復(fù)的字典
????其本質(zhì)是一個(gè)列表,列表元素為字典,核心思想是把鍵重復(fù)的item分散到不同字典
????封裝后列表對(duì)外操作像字典
????'''
????def?__init__(self):
????????self.dictList?=?[]
????def?add(self,key,value):
????????length?=?len(self.dictList)
????????i?=?0
????????while?i????????????if?not?self.dictList[i].get(key,None):
????????????????self.dictList[i][key]?=?value
????????????????return?i
????????????i?+=?1
????????newDict?=?{}
????????newDict[key]?=?value
????????self.dictList.append(newDict)
????????return?i
????def?delete(self,key):
????????'''
????????:param?key:?根據(jù)?key?刪除所有?item
????????'''
????????length?=?len(self.dictList)
????????for?i?in?range(length):
????????????response?=?self.dictList[i].pop(key,None)
????????????if?not?response:
????????????????break
????????#?清除哪些空容器,注意從后往前刪,否則會(huì)出現(xiàn)下標(biāo)越界
????????while?length>0:
????????????if?self.dictList[length-1]=={}:
????????????????del?self.dictList[length-1]
????????????length?-=?1
????def?query(self,key):
????????'''
????????:param?key:?查詢的健
????????:return:?由于允許鍵重復(fù),返回形式是一個(gè)列表
????????'''
????????result?=?[]
????????length?=?len(self.dictList)
????????for?i?in?range(length):
????????????response?=?self.dictList[i].get(key,None)
????????????if?not?response:
????????????????return?result
????????????result.append(response)
????????return?result
????def?__str__(self):
????????'''
????????:return:?打印整個(gè)字典
????????'''
????????resStr?=?''
????????length?=?len(self.dictList)
????????if?length==0:
????????????return?'該字典為空'
????????for?i?in?range(length):
????????????for?k,v?in?self.dictList[i].items():
????????????????aItem?=?'key:{:<8}value:{:<8}\n'.format(k,v)
????????????????resStr?+=?aItem
????????return??resStr
if?__name__?==?'__main__':
????app?=?QApplication(sys.argv)
????mainWin?=?RightTableView()
????mainWin.show()
????sys.exit(app.exec_())
def?getOptions(self,type):
????if?type==None?or?type=='K':
????????return?self.createKlines()
????elif?type=='Pie':
????????return?self.create_pie(v=[3000,600,5000])
#?K?圖表工具函數(shù)
def?createKlines(self):
????overlap?=?Overlap()
????for?quote?in?self.quote_data:
????????line?=?Line(quote['title'])
????????print(quote)
????????line.add('open',quote['date'],quote['open'],is_smooth=True)
????????line.add('close',quote['date'],quote['close'],is_smooth=True)
????????line.add('high',quote['date'],quote['high'],is_smooth=True)
????????line.add('low',quote['date'],quote['low'],is_smooth=True)
????????overlap.add(line)
????snippet?=?TRANSLATOR.translate(overlap.options)
????options?=?snippet.as_snippet()
????return?options
#?餅圖工具函數(shù)
def?create_pie(self,?v):
????pie?=?Pie()
????pie.add("昨日行情",['漲','平','跌'],?v,?is_label_show=True)
????snippet?=?TRANSLATOR.translate(pie.options)
????options?=?snippet.as_snippet()
????return?options? ? ? ? ? ? ? ? ? ? ? ? ? ?以上就是本次話題的所有內(nèi)容,代碼開(kāi)源,關(guān)注本公眾號(hào)并在后臺(tái)回復(fù) 股票即可獲得所有代碼,順祝大家元旦快樂(lè)(因?yàn)檫@篇文章從元旦開(kāi)始寫(xiě)的,笑~)
1、如果對(duì)于數(shù)據(jù)交互性沒(méi)有特殊要求的話,首推 matplotlib + seaborn ,其中 matplotlib 中成熟而強(qiáng)大的繪圖 api 應(yīng)有盡有,seaborn 相當(dāng)于調(diào)色筆,修改 matplotlib 本身的主題、配色風(fēng)格等;matplotlib 的另一大優(yōu)勢(shì)是可以結(jié)合 pandas 快速喂入數(shù)據(jù)。
2、如果對(duì)數(shù)據(jù)交互性要求高,需要點(diǎn)擊圖表查看數(shù)據(jù),首推 pyecharts;如果還喜歡二次元可愛(ài)風(fēng)的話,可以用 cutecharts, cutecharts 和 pycharts 均基于百度主導(dǎo)的 JavaScript 可視化框架 Echarts。
可以看到,cutecharts 繪制的圖表比較 Q(顯然不能做正式數(shù)據(jù)報(bào)表和論文圖表),當(dāng)鼠標(biāo)懸停到天線原理這一列時(shí),會(huì)顯示出學(xué)生 A 和 B 的成績(jī),但是 cutecharts 生成的是一個(gè) HTML 文件,需要用瀏覽器打開(kāi)才能顯示圖表,而 Python 第三方 GUI 庫(kù) PyQt5實(shí)現(xiàn)了瀏覽器組件 QtWebEngineWidgets,結(jié)合 Echarts 的 JavaScript API 就能不打開(kāi)瀏覽器實(shí)現(xiàn)酷炫的數(shù)據(jù)交互效果。實(shí)現(xiàn)效果
今天要講的主題就是使用 PyQt5+Echarts 實(shí)現(xiàn)股票數(shù)據(jù)看板,股票數(shù)據(jù)采集自網(wǎng)上公開(kāi)接口,考慮到網(wǎng)易財(cái)經(jīng)歷史數(shù)據(jù)全但有延時(shí),Tushare 數(shù)據(jù)更新快顆粒度高但調(diào)用次數(shù)有限制,融合使用網(wǎng)易財(cái)經(jīng)和 Tushare,爬蟲(chóng)這部分代碼不是今天的主題,可以跳過(guò),且所有代碼均已上傳,關(guān)注本公眾號(hào)并在后臺(tái)回復(fù) 股票 即可獲得所有代碼(包括爬蟲(chóng)+可視化)的下載鏈接。界面布局
如上圖所示,界面可細(xì)分為三大塊,左上角的昨日股票漲跌行情餅狀圖,右上角的展示股票排行榜的 QTabWidget 表格,以及下方的某只股票 Open-Close-High-Low折線圖。上圖中,考慮到計(jì)算量的問(wèn)題,餅狀圖和表格的數(shù)據(jù)都是直接偽造的,只有股票的折線圖數(shù)據(jù)是真實(shí)的。整個(gè)界面繼承自 QMainWindow,最外層的布局是豎直布局 QVBoxLayout,它包含界面上部分的 QHBoxLayout 和下方的 QHBoxLayout,并同時(shí)設(shè)置這兩個(gè) QHBoxLayout 的 拉伸因子為 1,這樣就能夠?qū)崿F(xiàn)上下部分等分整個(gè)界面并大小隨界面自適應(yīng)改變,其語(yǔ)法格式是vbox?=?QVBoxLayout()vbox.addLayout(QHBoxLayout())
vbox.addLayout(QHBoxLayout())
#?第一個(gè)參數(shù)表示?vbox?中組件的序號(hào),也就是添加順序
#?第二個(gè)參數(shù)?表示組件在?vbox?中的權(quán)重
vbox.setStretch(0,1)
vbox.setStretch(1,1)從小的方面來(lái)說(shuō),左上角和下部分的布局都是 PyQt5 中的 QtWebEngineWidgets 組件,它就像一個(gè)瀏覽器,通過(guò) QtWebEngineWidgets 調(diào)用 Echarts 中的 API,就能在 PyQt5 的界面中顯示 Echarts 各種各樣的的圖表。而右上角是一個(gè) QTabWidget 組件,為了減少代碼之間的耦合,我單獨(dú)把它寫(xiě)成一個(gè) RightTableView 類(lèi),#?-*-?coding:?utf-8?-*-
#?author:???????????inspurer(月小水長(zhǎng))
#?pc_type???????????lenovo
#?create_time:??????2019/12/18?21:54
#?file_name:????????rightview.py
#?github????????????https://github.com/inspurer
#?qq郵箱????????????2391527690@qq.com
#?微信公眾號(hào)?????????月小水長(zhǎng)(ID:?inspurer)
import?sys
from?PyQt5.QtWidgets?import?QApplication,QWidget,QVBoxLayout,QTabWidget,QLabel,QTableWidget,QAbstractItemView,QTableWidgetItem
from?PyQt5.QtCore?import?Qt
class?RightTableView(QWidget):
????def?__init__(self):
????????super().__init__()
????????self.mainLayout?=?QVBoxLayout()
????????tabWidgets?=?QTabWidget()
????????label?=?QLabel("前一日漲幅排名前十的股票詳細(xì)信息")
????????tabWidgets.addTab(label,?"漲幅排名")
????????label?=?QLabel("前一日成交量排名前十的股票詳細(xì)信息")
????????tabWidgets.addTab(label,?"成交量排名")
????????tabWidgets.currentChanged['int'].connect(self.tabClicked)???#?綁定標(biāo)簽點(diǎn)擊時(shí)的信號(hào)與槽函數(shù)
????????self.mainLayout.addWidget(tabWidgets)
????????self.tableView?=?QTableWidget()
????????self.table?=?QTableWidget(self)
????????self.table.setColumnCount(6)
????????self.table.setSelectionBehavior(QAbstractItemView.SelectRows)??#?設(shè)置表格的選取方式是行選取
????????self.table.setSelectionMode(QAbstractItemView.SingleSelection)??#?設(shè)置選取方式為單個(gè)選取
????????self.table.setHorizontalHeaderLabels(["股票代碼",?"開(kāi)盤(pán)",?"收盤(pán)",'最高','最低','成交量'])??#?設(shè)置行表頭
????????self.mainLayout.addWidget(self.table)
????????self.mainLayout.setStretch(0,1)
????????self.mainLayout.setStretch(1,12)
????????self.setLayout(self.mainLayout)
????????self.updateView()
????def?updateView(self):
????????self.table.insertRow(0)
????????stock_code?=?QTableWidgetItem("1001")
????????stock_code.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_code.setTextAlignment(Qt.AlignCenter)
????????stock_open?=?QTableWidgetItem("10.20")??
????????stock_open.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_open.setTextAlignment(Qt.AlignCenter)
????????stock_close?=?QTableWidgetItem("10.20")??
????????stock_close.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_close.setTextAlignment(Qt.AlignCenter)
????????stock_high?=?QTableWidgetItem("10.20")??
????????stock_high.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)?
????????stock_high.setTextAlignment(Qt.AlignCenter)
????????stock_low?=?QTableWidgetItem("10.20")??
????????stock_low.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)??
????????stock_dealNum.setFlags(Qt.ItemIsSelectable?|?Qt.ItemIsEnabled)?
????????stock_dealNum.setTextAlignment(Qt.AlignCenter)
????????self.table.setItem(0,?0,?stock_code)
????????self.table.setItem(0,?1,?stock_open)
????????self.table.setItem(0,?2,?stock_close)
????????self.table.setItem(0,?3,?stock_high)
????????self.table.setItem(0,?4,?stock_low)
????????self.table.setItem(0,?5,?stock_dealNum)
????def?tabClicked(self,index):
????????'''
????????tab?監(jiān)聽(tīng)事件,在此添加業(yè)務(wù)邏輯
????????'''
????????print(index)RightTableView 實(shí)現(xiàn)了 tab 的監(jiān)聽(tīng),切換不同的 tab 可根據(jù) index 展示不同的數(shù)據(jù),因此,在主模塊中初始化 RightTableView 類(lèi)的時(shí)候,應(yīng)當(dāng)給定 RightTableView 可能用到的所有數(shù)據(jù),這樣可以避免使用 Signal 信號(hào)來(lái)進(jìn)行主模塊和 RightTableView 模塊的通信。在主模塊中,通過(guò) from rightview import RightTableView即可引入 RightTableView 布局,其中 rightview 是文件名,RightTableView 是類(lèi)名,如改行代碼爆紅(實(shí)際上不影響運(yùn)行),可在項(xiàng)目上右鍵 Mark Dircectory as -> Sources Root 解決之。
數(shù)據(jù)驅(qū)動(dòng)
實(shí)際上,在三個(gè)小布局中,界面上部的兩個(gè)布局的數(shù)據(jù)均是偽造的,因?yàn)檫@個(gè)數(shù)據(jù)的采集及計(jì)算太過(guò)耗時(shí)在 basic 表中,我記錄了 5000 支股票的基礎(chǔ)信息:股票交易所、股票發(fā)行公司、股票代碼,上部的兩個(gè)布局需要這 5000 支股票的整體數(shù)據(jù),即 5000 支股票昨日相較于前日的跌漲幅,5000 支股票的跌漲幅度的排名,作為一個(gè)客戶端軟件,我覺(jué)得一個(gè)操作所能忍受的時(shí)延是 3 s 以內(nèi),優(yōu)于接口還有速率限制,粗略計(jì)算了一下,這個(gè)過(guò)程遠(yuǎn)遠(yuǎn)超過(guò)了 30 s,所以我覺(jué)得可行的辦法是將這種采集和計(jì)算過(guò)程部署到服務(wù)器,通過(guò)設(shè)置定時(shí)任務(wù)執(zhí)行,客戶端每次打開(kāi)只需要一個(gè)簡(jiǎn)單的 Get 請(qǐng)求即可立即渲染數(shù)據(jù)。而下方的股票 Open-Close-High-Low 折線圖所需數(shù)據(jù)的計(jì)算量比較小,可直接完成,用戶輸入股票發(fā)行公司,即可返回該公司發(fā)行股票的代碼,(因?yàn)槲覀円话阌涀〉氖枪善卑l(fā)行公司而不是股票代碼,就行我們往往記住網(wǎng)站的域名而不是 ip 地址),如果數(shù)據(jù)庫(kù)中不存在代碼該股票的表(表名=發(fā)行公司_股票代碼),就新建,并抓取指定日期的數(shù)據(jù)存入該表;如果表存在但是缺少用戶想要的數(shù)據(jù),則更新數(shù)據(jù)即可;這樣設(shè)計(jì)的好處是盡可能減少平均操作時(shí)延。再說(shuō)這個(gè)用戶輸入股票發(fā)行公司,即可返回該公司發(fā)行股票的代碼,乍一看就是一個(gè) key-value 字典,為了減少數(shù)據(jù)庫(kù)的操作,在程序初始化過(guò)程中,我們需要把 basic 表中的股票數(shù)據(jù)全部加載進(jìn)內(nèi)存,也就是放進(jìn)字典里,但是由于一個(gè)公司可能發(fā)現(xiàn)很多股票,但是 Python 內(nèi)置的字典 一個(gè) key 只能對(duì)應(yīng)一個(gè) value ,我們很容易想到把 value 設(shè)計(jì)成一個(gè)列表,但是這樣破環(huán)了字典的原子性,假如后面我們新加了一個(gè)需要,根據(jù) value 反查 key,也就是說(shuō)根據(jù)股票代碼反查股票發(fā)行公司,如果設(shè)計(jì)成列表,這個(gè)反查耗時(shí)將是巨大的,考慮再三,我在不破壞字典 item 的原子性的前提下,實(shí)現(xiàn)了 value 可重復(fù) dict,其本質(zhì)是一個(gè)列表,列表元素為字典,核心思想是把鍵重復(fù)的item分散到不同字典,不過(guò)經(jīng)過(guò)封裝,對(duì)外操作和字典一樣,下面是該可重復(fù)字典的實(shí)現(xiàn)#?-*-?coding:?utf-8?-*-#?author:???????????inspurer(月小水長(zhǎng))
#?pc_type???????????lenovo
#?create_time:??????2019/12/2?12:25
#?file_name:????????myDict.py
#?github????????????https://github.com/inspurer
#?qq郵箱????????????2391527690@qq.com
#?微信公眾號(hào)?????????月小水長(zhǎng)(ID:?inspurer)
class?AllowKeyRepeatDict():
????'''
????自定義允許鍵重復(fù)的字典
????其本質(zhì)是一個(gè)列表,列表元素為字典,核心思想是把鍵重復(fù)的item分散到不同字典
????封裝后列表對(duì)外操作像字典
????'''
????def?__init__(self):
????????self.dictList?=?[]
????def?add(self,key,value):
????????length?=?len(self.dictList)
????????i?=?0
????????while?i????????????if?not?self.dictList[i].get(key,None):
????????????????self.dictList[i][key]?=?value
????????????????return?i
????????????i?+=?1
????????newDict?=?{}
????????newDict[key]?=?value
????????self.dictList.append(newDict)
????????return?i
????def?delete(self,key):
????????'''
????????:param?key:?根據(jù)?key?刪除所有?item
????????'''
????????length?=?len(self.dictList)
????????for?i?in?range(length):
????????????response?=?self.dictList[i].pop(key,None)
????????????if?not?response:
????????????????break
????????#?清除哪些空容器,注意從后往前刪,否則會(huì)出現(xiàn)下標(biāo)越界
????????while?length>0:
????????????if?self.dictList[length-1]=={}:
????????????????del?self.dictList[length-1]
????????????length?-=?1
????def?query(self,key):
????????'''
????????:param?key:?查詢的健
????????:return:?由于允許鍵重復(fù),返回形式是一個(gè)列表
????????'''
????????result?=?[]
????????length?=?len(self.dictList)
????????for?i?in?range(length):
????????????response?=?self.dictList[i].get(key,None)
????????????if?not?response:
????????????????return?result
????????????result.append(response)
????????return?result
????def?__str__(self):
????????'''
????????:return:?打印整個(gè)字典
????????'''
????????resStr?=?''
????????length?=?len(self.dictList)
????????if?length==0:
????????????return?'該字典為空'
????????for?i?in?range(length):
????????????for?k,v?in?self.dictList[i].items():
????????????????aItem?=?'key:{:<8}value:{:<8}\n'.format(k,v)
????????????????resStr?+=?aItem
????????return??resStr
if?__name__?==?'__main__':
????app?=?QApplication(sys.argv)
????mainWin?=?RightTableView()
????mainWin.show()
????sys.exit(app.exec_())
設(shè)計(jì)模式
當(dāng) QtWebEngineWidgets 需要新建一個(gè)圖表獲取句柄時(shí),它希望屏蔽掉新建的具體細(xì)節(jié),我們可以設(shè)計(jì)一個(gè)函數(shù)對(duì)應(yīng)一種圖表來(lái)實(shí)現(xiàn)這個(gè)功能,但是我們又不想每次新建圖表時(shí)去找對(duì)應(yīng)的函數(shù),這個(gè)時(shí)候可以再設(shè)計(jì)一個(gè)代理函數(shù),告訴這個(gè)代理函數(shù)我們需要怎樣的圖表即可獲取相應(yīng)圖表的句柄。#?代理函數(shù)def?getOptions(self,type):
????if?type==None?or?type=='K':
????????return?self.createKlines()
????elif?type=='Pie':
????????return?self.create_pie(v=[3000,600,5000])
#?K?圖表工具函數(shù)
def?createKlines(self):
????overlap?=?Overlap()
????for?quote?in?self.quote_data:
????????line?=?Line(quote['title'])
????????print(quote)
????????line.add('open',quote['date'],quote['open'],is_smooth=True)
????????line.add('close',quote['date'],quote['close'],is_smooth=True)
????????line.add('high',quote['date'],quote['high'],is_smooth=True)
????????line.add('low',quote['date'],quote['low'],is_smooth=True)
????????overlap.add(line)
????snippet?=?TRANSLATOR.translate(overlap.options)
????options?=?snippet.as_snippet()
????return?options
#?餅圖工具函數(shù)
def?create_pie(self,?v):
????pie?=?Pie()
????pie.add("昨日行情",['漲','平','跌'],?v,?is_label_show=True)
????snippet?=?TRANSLATOR.translate(pie.options)
????options?=?snippet.as_snippet()
????return?options? ? ? ? ? ? ? ? ? ? ? ? ? ?以上就是本次話題的所有內(nèi)容,代碼開(kāi)源,關(guān)注本公眾號(hào)并在后臺(tái)回復(fù) 股票即可獲得所有代碼,順祝大家元旦快樂(lè)(因?yàn)檫@篇文章從元旦開(kāi)始寫(xiě)的,笑~)
總結(jié)
以上是生活随笔為你收集整理的echarts tab切换_Python 数据可视化实战:使用 PyQt5 和 Echarts 打造股票数据看板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 割平面法只能求解纯整数规划吗_离散规划
- 下一篇: c++ 单例模式_Java面试题总结之设