🌟【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】🌟
📣開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主!
👉 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"挖山不止"的毅力為開發者們搬開知識道路上的重重阻礙!
💎【行業認證·權威頭銜】
? 華為云天團核心成員:特約編輯/云享專家/開發者專家/產品云測專家
? 開發者社區全滿貫:CSDN博客&商業化雙料專家/阿里云簽約作者/騰訊云內容共創官/掘金&亞馬遜&51CTO頂級博主
? 技術生態共建先鋒:橫跨鴻蒙、云計算、AI等前沿領域的技術布道者
🏆【榮譽殿堂】
🎖 連續三年蟬聯"華為云十佳博主"(2022-2024)
🎖 雙冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余個技術社區年度杰出貢獻獎得主
📚【知識寶庫】
覆蓋全棧技術矩陣:
? 編程語言:.NET/Java/Python/Go/Node…
? 移動生態:HarmonyOS/iOS/Android/小程序
? 前沿領域:物聯網/網絡安全/大數據/AI/元宇宙
? 游戲開發:Unity3D引擎深度解析
每日更新硬核教程+實戰案例,助你打通技術任督二脈!
💌【特別邀請】
正在構建技術人脈圈的你:
👍 如果這篇推文讓你收獲滿滿,點擊"在看"傳遞技術火炬
💬 在評論區留下你最想學習的技術方向
? 點擊"收藏"建立你的私人知識庫
🔔 關注公眾號獲取獨家技術內參
?與其仰望大神,不如成為大神!關注"愚公搬代碼",讓堅持的力量帶你穿越技術迷霧,見證從量變到質變的奇跡!? |
文章目錄
- 🚀前言
- 🚀一、主窗體的數據展示
- 🔎1.顯示前10名熱賣榜圖文信息
- 🦋1.1 步驟概述
- 🦋1.2 具體步驟
- ??(1) 導入自定義模塊并創建對象
- ??(2) 獲取熱賣排行榜信息并插入數據庫
- ??(3) 創建 `show_top10()` 方法顯示圖文信息
- ??(4) 創建用于顯示商品圖片的 `QLabel` 控件
- ??(5) 創建用于顯示好評率的 `QLabel` 控件
- ??(6) 創建用于顯示商品名稱的 `QLabel` 控件
- ??(7) 創建用于顯示商品價格的 `QLabel` 控件
- ??(8) 創建關注商品按鈕 `QPushButton`
- ??(9) 將動態創建的布局添加到網格布局
- ??(10) 在主程序入口調用 `show_top10()` 方法
- 🦋1.3 運行效果
- 🔎2.顯示關注商品列表
- 🦋2.1 確認關注
- 🦋2.2 取消關注
- 🔎3.顯示商品分類比例餅圖
- 🦋3.1 創建 `chart.py` 文件
- 🦋3.2 創建 `pie_chart()` 方法顯示餅圖
- 🦋3.3 在 `show_window.py` 中導入自定義餅圖類
- 🦋3.4 排除重復商品名稱并計算分類比例
- 🦋3.5 計算其他商品分類的占比
- 🦋3.6 創建餅圖并顯示
- 🦋3.7 調用 `show_classification()` 方法顯示餅圖
- 🦋3.8 運行并顯示餅圖
🚀前言
在之前的內容中,我們已經完成了電商數據偵探項目的多個環節,包括需求分析、系統設計、UI設計以及數據的爬取與存儲。現在,我們進入了項目的下一階段——主窗體的數據展示。
數據展示是爬蟲項目中至關重要的一步,因為它直接影響到用戶如何理解和利用爬取到的數據。一個清晰、直觀的數據展示界面不僅能提升用戶體驗,還能幫助用戶更有效地分析和決策。在本篇文章中,我們將重點討論如何將爬取到的電商數據呈現給用戶,并為后續的數據分析提供方便。
具體內容包括:
- 數據展示的設計原則:如何設計一個直觀的界面,確保用戶可以清晰地看到爬取的數據,避免信息過載。
- 商品信息展示:將商品的關鍵信息(如名稱、價格、評分、銷量等)通過表格、列表或圖形化的方式展示,確保用戶能夠輕松瀏覽。
- 價格走勢圖展示:通過圖表的方式展示商品的價格波動情況,幫助用戶分析商品價格的走勢和規律。
- 用戶評價展示:展示商品的用戶評論,包括評分、評論內容等,便于用戶了解其他消費者的購買體驗。
- 交互與更新:實現動態數據展示,支持用戶刷新、篩選或排序數據,以便于用戶根據不同需求查看信息。
- 數據的可視化展示:使用圖表或圖形方式進一步呈現數據趨勢,例如價格變化趨勢圖、熱銷商品排名圖等,提升數據分析的可視化效果。
通過本篇文章的學習,你將學會如何將爬取到的電商數據通過精心設計的主窗體展現給用戶,使數據不僅僅是冷冰冰的數字,而是充滿價值的信息和見解。這將大大提升你爬蟲項目的實用性和商業價值。
🚀一、主窗體的數據展示
在實現主窗體數據展示時,需要考慮到主窗體中有三個區域:
- 顯示前10名熱賣榜圖文信息
- 顯示關注商品列表
- 顯示商品分類餅圖
首先,我們需要動態創建“顯示前10名熱賣榜圖文信息”的布局,并實現商品的關注功能。接著,我們將單獨創建一個圖表文件來顯示商品分類比例的餅圖。最后,使用數據庫操作文件將所有數據顯示在主窗體中。
🔎1.顯示前10名熱賣榜圖文信息
🦋1.1 步驟概述
- 導入相關自定義模塊:首先,需要導入自定義數據庫操作類和爬蟲類。
- 獲取熱賣榜信息并插入數據庫:爬取熱賣榜信息并將其保存至數據庫中。
- 從數據庫中提取數據:從數據庫中提取前10名熱賣榜信息。
- 動態創建布局:根據提取的數據顯示圖文信息。
- 顯示熱賣榜圖文信息:將圖文信息展示在主窗體上。
🦋1.2 具體步驟
??(1) 導入自定義模塊并創建對象
首先,在 show_window.py
文件中導入數據庫操作類和爬蟲類,并創建相應的對象。代碼如下:
from mysql import MySQL
from crawl import Crawlmycrawl = Crawl() # 創建爬蟲類對象
mysql = MySQL() # 創建數據庫對象# 連接數據庫
sql = mysql.connection_sql()# 創建數據庫游標
cur = sql.cursor()
??(2) 獲取熱賣排行榜信息并插入數據庫
在 Main
類的 __init__()
方法中,獲取熱賣排行榜信息與商品價格,并將數據保存到數據庫中。代碼如下:
# 獲取熱賣排行榜信息
id_str = mycrawl.get_rankings_json('https://ch.jd.com/hotsale2?cateid=686')
rankings_list = mycrawl.get_price(id_str) # 獲取價格,然后在該方法中將所有數據保存至列表并返回
mysql.insert_ranking(cur, rankings_list, 'jd_ranking') # 將數據插入數據庫
??(3) 創建 show_top10()
方法顯示圖文信息
在 Main
類中,創建 show_top10()
方法來顯示前10名熱賣榜圖文信息。在該方法中,首先創建外層布局 QWidget
控件。代碼如下:
def show_top10(self):top_10_info = mysql.query_top10_info(cur) # 查詢排行數據表前10名商品名稱,價格,好評率# 行數標記i = -1for n in range(10):# x 確定每行顯示的個數 0,1,2 每行2個x = n % 2# 當x為0的時候設置換行 行數+1if x == 0:i += 1# 創建布局self.widget = QtWidgets.QWidget()# 給布局命名self.widget.setObjectName("widget" + str(n))# 設置布局樣式self.widget.setStyleSheet('QWidget#' + "widget" + str(n) + "{border:2px solid rgb(175, 175, 175);background-color: rgb(255, 255, 255);}")
??(4) 創建用于顯示商品圖片的 QLabel
控件
依次添加代碼,在 QWidget
控件中創建用于顯示商品圖片的 QLabel
控件。代碼如下:
# 創建個Qlabel控件用于顯示圖片 設置控件在QWidget中
self.label = QtWidgets.QLabel(self.widget)
# 設置大小
self.label.setGeometry(QtCore.QRect(15, 15, 160, 160))
# 設置要顯示的圖片
self.label.setPixmap(QtGui.QPixmap('img_download/' + str(n) + '.jpg'))
# 圖片顯示方式 讓圖片適應QLabel的大小
self.label.setScaledContents(True)
# 給顯示圖片的label控件命名
self.label.setObjectName("img_download" + str(n))
# 設置控件樣式
self.label.setStyleSheet('border:2px solid rgb(175, 175, 175);')
??(5) 創建用于顯示好評率的 QLabel
控件
添加代碼,在 QWidget
控件中創建用于顯示好評率的 QLabel
控件。代碼如下:
# 顯示好評的Label控件
self.label_good = QtWidgets.QLabel(self.widget)
# 給好評率控件命名
self.label_good.setObjectName("good" + str(n))
self.label_good.setGeometry(QtCore.QRect(24, 180, 141, 40)) # 設置控件位置及大小
# 設置控件樣式,邊框與顏色
self.label_good.setStyleSheet("border: 2px solid rgb(255, 148, 61);color: rgb(255, 148, 61);")
self.label_good.setAlignment(QtCore.Qt.AlignCenter) # 控件內文字居中顯示
self.label_good.setText('好評率' + top_10_info[n][2]) # 顯示好評率的文字
font = QtGui.QFont() # 創建字體對象
font.setPointSize(18) # 設置字體大小
font.setBold(True) # 開啟粗體屬性
font.setWeight(75) # 設置文字粗細
self.label_good.setFont(font) # 設置字體
??(6) 創建用于顯示商品名稱的 QLabel
控件
依次添加代碼,在 QWidget
控件中創建用于顯示商品名稱的 QLabel
控件。代碼如下:
# 顯示名稱的Label控件
self.label_name = QtWidgets.QLabel(self.widget)
# 給顯示名稱控件命名
self.label_name.setObjectName("good" + str(n))
# 設置控件位置及大小
self.label_name.setGeometry(QtCore.QRect(185, 30, 228, 80))
self.label_name.setText(top_10_info[n][0]) # 設置顯示名稱的文字
# 左上角為主顯示文字
self.label_name.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.label_name.setWordWrap(True) # 設置文字自動換行
font = QtGui.QFont() # 創建字體對象
font.setPointSize(9) # 設置字體大小
font.setBold(True) # 開啟粗體屬性
font.setWeight(75) # 設置文字粗細
self.label_name.setFont(font) # 設置字體
??(7) 創建用于顯示商品價格的 QLabel
控件
依次添加代碼,在 QWidget
控件中創建用于顯示商品價格的 QLabel
控件。代碼如下:
# 顯示價格的Label控件
self.label_price = QtWidgets.QLabel(self.widget)
# 給顯示價格控件命名
self.label_price.setObjectName("price" + str(n))
# 設置控件位置及大小
self.label_price.setGeometry(QtCore.QRect(200, 80, 228, 80))
# 設置控件樣式
self.label_price.setStyleSheet("color: rgb(255, 0, 0);")
self.label_price.setText('¥' + top_10_info[n][1]) # 設置顯示的價格文字
font = QtGui.QFont() # 創建字體對象
font.setPointSize(20) # 設置字體大小
font.setBold(True) # 開啟粗體屬性
font.setWeight(75) # 設置文字粗細
self.label_price.setFont(font) # 設置字體
??(8) 創建關注商品按鈕 QPushButton
依次添加代碼,在 QWidget
控件中創建用于顯示關注商品的 QPushButton
控件。代碼如下:
# 顯示關注按鈕控件
self.pushButton = QtWidgets.QPushButton(self.widget)
# 給顯示價格控件命名
self.pushButton.setObjectName(str(n))
# 設置控件位置及大小
self.pushButton.setGeometry(QtCore.QRect(300, 160, 100, 50))
font = QtGui.QFont() # 創建字體對象
font.setFamily("楷體") # 設置字體
font.setPointSize(18) # 設置字體大小
font.setBold(True) # 開啟粗體屬性
font.setWeight(75) # 設置文字粗細
self.pushButton.setFont(font) # 設置字體
# 設置關注按鈕控件樣式
self.pushButton.setStyleSheet("background-color: rgb(223, 48, 51);color: rgb(255, 255, 255);")
self.pushButton.setText('關注') # 設置關注按鈕顯示的文字
# 注冊關注按鈕信號槽
self.pushButton.clicked.connect(self.attention_btn)
??(9) 將動態創建的布局添加到網格布局
將動態創建的 widget
布局添加到網格布局中,并設置滾動條的高度為動態高度。代碼如下:
# 把動態創建的widegt布局添加到gridLayout中 i,x分別代表:行數以及每行的個數self.gridLayout.addWidget(self.widget, i, x)# 設置高度為動態高度根據 行數確定高度 每行300
self.scrollAreaWidgetContents.setMinimumHeight((i+1) * 240)
# 設置網格布局控件動態高度
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 850, ((i+1) * 240)))
??(10) 在主程序入口調用 show_top10()
方法
最后,在主程序入口顯示主窗體時,調用 show_top10()
方法。代碼如下:
main.show_top10()
🦋1.3 運行效果
運行 show_window.py
文件后,主窗體會顯示熱賣商品前10名的圖文信息,如圖所示。由于熱賣商品排行榜數據會自動更新,主窗體每次顯示的信息可能會有所變化。
🔎2.顯示關注商品列表
在實現顯示關注商品列表時,需要首先實現熱賣商品的關注功能。關注按鈕需要設置關注事件,單擊商品的關注按鈕時會彈出一個確認關注的小窗體,以避免誤操作。確認關注后,需要將商品信息保存至數據庫,并將關注的商品名稱顯示在關注商品列表中。同時,取消關注功能也需要實現,單擊關注商品列表中的商品名稱時,會彈出確認取消關注的小窗體進行確認。
🦋2.1 確認關注
-
窗體設計
- 打開Qt Designer工具,設置窗體的最大尺寸與最小尺寸為400x200,并移除默認的狀態欄和菜單欄。
- 在窗體中拖入一個
QLineEdit
控件用于顯示需要關注商品的名稱,拖入兩個QPushButton
控件分別用于確認關注與取消關注。 - 窗體設計完成后,保存為
attention_window.ui
文件,使用pyuic
工具將其轉換為attention_window.py
文件。
-
代碼實現
- 在
attention_window.py
文件中,將默認生成的Ui_MainWindow
類修改為Attention_MainWindow
。 - 打開
show_window.py
文件,導入關注窗體文件中的UI類,并定義顯示提示對話框的方法:
from attention_window import Attention_MainWindow # 導入關注窗體文件中的UI類 attention_info = '' # 關注商品信息 def messageDialog(title, message):msg_box = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, title, message)msg_box.exec()
- 在
-
關注按鈕事件
- 在Main類中,創建
attention_btn()
方法處理關注按鈕的事件:
# 關注按鈕事件 def attention_btn(self):# 獲取信號源 點擊的按鈕sender = self.gridLayout.sender()global attention_info# 因為創建關注按鈕對象名稱是以0為起始,最后一個關注按鈕為9,# 所以用單擊按鈕的對象名稱+1作為數據庫中的idattention_info = mysql.query_id_info(cur, int(sender.objectName()) + 1)# 將商品名稱顯示在關注窗體的編輯框內attention.lineEdit.setText(attention_info[0])attention.open() # 顯示關注窗體
- 在Main類中,創建
-
顯示關注商品名稱列表
- 創建
show_attention_name()
方法來顯示已關注商品的名稱列表:
def show_attention_name(self):self.name_list = []row, column, results = mysql.query_evaluate_info(cur, 'attention')if row != 0:for index, i in enumerate(results):self.name_list.append('關注商品' + str(index + 1) + ':\n' + i[1])font = QtGui.QFont()font.setPointSize(12)self.listView.setFont(font)self.listView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)self.listView.setWordWrap(True)model = QtCore.QStringListModel()model.setStringList(self.name_list)self.listView.setModel(model)else:model = QtCore.QStringListModel()model.setStringList(self.name_list)self.listView.setModel(model)
- 創建
-
初始化關注窗體
- 創建
Attention
類,并通過__init__()
方法初始化關注窗體:
class Attention(QMainWindow, Attention_MainWindow):def __init__(self):super(Attention, self).__init__()self.setupUi(self)# 開啟自動填充背景self.centralwidget.setAutoFillBackground(True)palette = QtGui.QPalette() # 調色板類palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img_resources/attention_bg.png'))) # 設置背景圖片self.centralwidget.setPalette(palette) # 為控件設置對應的調色板即可# 設置背景透明self.pushButton_yes.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_yes.setIcon(QtGui.QIcon('img_resources/yes_btn.png'))# 設置按鈕背景圖大小self.pushButton_yes.setIconSize(QtCore.QSize(100, 50))# 設置背景透明self.pushButton_no.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_no.setIcon(QtGui.QIcon('img_resources/no_btn.png'))# 設置按鈕背景圖大小self.pushButton_no.setIconSize(QtCore.QSize(100, 50))
- 創建
-
插入關注商品信息到數據庫
- 創建
insert_attention_message()
方法,將商品信息插入數據庫:
# 打開關注窗體def open(self):self.show()def insert_attention_message(self, attention_info):is_identical = mysql.query_is_name(cur, attention_info[0]) # 判斷數據庫中是否已經關注了該商品if is_identical == 0:middle_time = mycrawl.get_evaluation(2, attention_info[2])poor_time = mycrawl.get_evaluation(1, attention_info[2])# 判斷信息狀態if middle_time != None and poor_time != None:attention_info = attention_info + (middle_time, poor_time) # 將評價時間添加至商品數據中mysql.insert_attention(cur, [attention_info], 'attention') # 插入關注信息messageDialog('提示!', '已關注' + attention_info[0]) # 提示attention.close() # 關閉關注對話框main.show_attention_name() # 顯示關注商品的名稱else:print('無法獲取評價時間!')else:messageDialog('警告!', '不可以關注相同的商品!')attention.close()
- 創建
-
設置按鈕事件
- 在主程序的主入口處,創建關注窗體對象并設置按鈕事件:
attention = Attention() attention.pushButton_yes.clicked.connect(lambda: attention.insert_attention_message(attention_info)) attention.pushButton_no.clicked.connect(attention.close) main.show_attention_name()
-
注冊關注按鈕信號槽
- 在
show_top10()
方法中,注冊關注按鈕的信號槽:
self.pushButton.clicked.connect(self.attention_btn)
- 在
-
運行并測試
- 運行
show_window.py
文件,單擊商品的“關注”按鈕后,將彈出確認關注窗體,確認后會顯示提示框并更新關注商品列表。
- 運行
🦋2.2 取消關注
取消關注的小窗體與確認關注的小窗體相似,唯一不同的是背景圖片和文字。以下是實現步驟:
class Cancel_Attention(QMainWindow, Attention_MainWindow):def __init__(self):super(Cancel_Attention, self).__init__()self.setupUi(self)# 開啟自動填充背景self.centralwidget.setAutoFillBackground(True)palette = QtGui.QPalette() # 調色板類palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img_resources/cancel_attention_bg.png'))) # 設置背景圖片self.centralwidget.setPalette(palette) # 為控件設置對應的調色板即可# 設置背景透明self.pushButton_yes.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_yes.setIcon(QtGui.QIcon('img_resources/yes_btn.png'))# 設置按鈕背景圖大小self.pushButton_yes.setIconSize(QtCore.QSize(100, 50))# 設置背景透明self.pushButton_no.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_no.setIcon(QtGui.QIcon('img_resources/no_btn.png'))# 設置按鈕背景圖大小self.pushButton_no.setIconSize(QtCore.QSize(100, 50))# 顯示取消關注的窗體def open(self,qModeIndex):# 在關注商品名稱列表中,獲取單擊了哪一個商品的名稱name = main.name_list[qModeIndex.row()].lstrip('關注商品'+str(qModeIndex.row()+1)+':\n')# 將商品名稱顯示在關注窗體的編輯框內cancel_attention.lineEdit.setText(name)cancel_attention.show() # 顯示關注窗體# 取消關注的方法def unfollow(self):# 獲取編輯框內的商品名稱name = cancel_attention.lineEdit.text()mysql.delete_attention(cur,name)main.show_attention_name() # 顯示關注商品名稱列表cancel_attention.close() # 關掉取消關注的窗體
程序啟動文件如下:
cancel_attention = Cancel_Attention()
# 指定顯示關注商品名稱列表事件
main.listView.clicked.connect(cancel_attention.open)
# 指定取消關注窗體按鈕(是)單擊事件處理方法
cancel_attention.pushButton_yes.clicked.connect(cancel_attention.unfollow)
# 指定取消關注窗體按鈕(否)單擊事件處理方法
cancel_attention.pushButton_no.clicked.connect(cancel_attention.close)
這樣,整個關注與取消關注功能就完成了。
🔎3.顯示商品分類比例餅圖
在實現顯示商品分類比例餅圖時,首先需要創建一個圖表文件,接著在該文件中創建用于顯示餅圖的方法。然后,將計算出的商品分類比例作為參數傳遞給該方法,最終將餅圖顯示在主窗體中。具體步驟如下:
🦋3.1 創建 chart.py
文件
首先,在項目文件夾中創建 chart.py
文件,并導入圖表相關的模塊。接著,創建 PlotCanvas
類,并在該類中通過 __init__()
方法進行初始化工作。代碼如下:
# 圖形畫布
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib # 導入圖表模塊
import matplotlib.pyplot as plt # 導入繪圖模塊class PlotCanvas(FigureCanvas):def __init__(self, parent=None, width=0, height=0, dpi=100):# 避免中文亂碼matplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falsefig = plt.figure(figsize=(width, height), dpi=dpi) # 創建圖形FigureCanvas.__init__(self, fig)self.setParent(parent) # 設置父類
🦋3.2 創建 pie_chart()
方法顯示餅圖
在 PlotCanvas
類中,創建 pie_chart()
方法,用于顯示商品分類的餅圖。代碼如下:
# 顯示商品分類餅圖
def pie_chart(self, size):# 繪制餅圖explode = (0.1, 0, 0, 0, 0) # 設置各部分突出label_list = ['鼠標', '鍵盤', 'U盤', '移動硬盤', '其他'] # 各部分標簽plt.pie(size, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=30, pctdistance=0.6)plt.axis("equal") # 設置橫軸和縱軸大小相等,這樣餅才是圓的
🦋3.3 在 show_window.py
中導入自定義餅圖類
在 show_window.py
文件中導入 PlotCanvas
類,并在 Main
類中創建 show_classification()
方法。該方法的功能是獲取商品排名和數量,并統計商品分類比例。代碼如下:
# 導入自定義餅圖類
from chart import PlotCanvas# 顯示商品分類比例餅圖
def show_classification(self):name_all = mysql.query_rankings_name(cur, 'jd_ranking') # 獲取排行榜中所有商品名稱name_number = len(name_all) # 獲取商品總數量number = 0 # 定義統計分類數量的變量remove_list = [] # 保存需要移除的商品名稱class_list = [] # 保存所有分類比例數據的列表
🦋3.4 排除重復商品名稱并計算分類比例
為避免統計重復的商品名稱(如“鼠標墊”和“鼠標”相似),首先移除這些商品,然后計算不同分類的占比。代碼如下:
# 因為鼠標墊與鼠標名稱接近,所以先移除鼠標墊
for name in name_all:if '鼠標墊' in name:remove_list.append(name)# 循環移除鼠標墊相關商品
for r_name in remove_list:name_all.remove(r_name)# 獲取鼠標分類占有比例
for name in name_all:if '鼠標' in name:number += 1
mouse_ratio = float('%.1f' % ((number / name_number) * 100)) # 計算鼠標百分比
class_list.append(mouse_ratio) # 向分類比例列表添加鼠標百分比數據
🦋3.5 計算其他商品分類的占比
依次計算鍵盤、U盤、移動硬盤和其他類別的占比。代碼如下:
# 獲取鍵盤占有比例
number = 0
for name in name_all:if '鍵盤' in name:number += 1
keyboard_ratio = float("%.1f" % ((number / name_number) * 100))
class_list.append(keyboard_ratio)# 獲取U盤占有比例
number = 0
for name in name_all:if 'U盤' in name or 'u盤' in name:number += 1
u_ratio = float('%.1f' % ((number / name_number) * 100))
class_list.append(u_ratio)# 獲取移動硬盤占有比例
number = 0
for name in name_all:if '移動硬盤' in name:number += 1
move_ratio = float('%.1f' % ((number / name_number) * 100))
class_list.append(move_ratio)# 計算其他百分比
other_ratio = float('%.1f' % (100 - (mouse_ratio + keyboard_ratio + u_ratio + move_ratio)))
class_list.append(other_ratio)
🦋3.6 創建餅圖并顯示
創建 PlotCanvas
類對象,并調用 pie_chart()
方法將餅圖添加到主窗體的布局中。代碼如下:
# 創建餅圖類對象
pie = PlotCanvas()# 調用顯示餅圖的方法
pie.pie_chart(class_list)# 將餅圖添加到主窗體的水平布局中
self.horizontalLayout.addWidget(pie)
🦋3.7 調用 show_classification()
方法顯示餅圖
在主程序入口中,調用 show_classification()
方法來顯示商品分類比例餅圖。代碼如下:
# 顯示商品分類比例餅圖
main.show_classification()
🦋3.8 運行并顯示餅圖
運行 show_window.py
文件時,主窗體的左上角將顯示商品分類比例的餅圖。