基于Python開發(fā)網(wǎng)絡(luò)速度監(jiān)控工具
1. 簡(jiǎn)介
這個(gè)程序是一個(gè)基于 PyQt5 框架開發(fā)的實(shí)時(shí)網(wǎng)絡(luò)速度監(jiān)控工具,能夠顯示當(dāng)前設(shè)備的上傳和下載速度。它以一個(gè)小巧的窗口形式展示,默認(rèn)位置為屏幕的右下角,且窗口始終置頂。程序的顯示內(nèi)容包括上傳和下載的網(wǎng)絡(luò)速度,并支持通過鼠標(biāo)拖動(dòng)移動(dòng)窗口。
功能介紹
實(shí)時(shí)網(wǎng)絡(luò)速度監(jiān)控:
- 通過 psutil 庫(kù)獲取當(dāng)前設(shè)備的網(wǎng)絡(luò)流量數(shù)據(jù),包括上傳和下載的字節(jié)數(shù)。
- 每秒刷新一次上傳和下載速度,單位為 Kb/s 或 Mb/s(當(dāng)速度超過 1MB/s時(shí)自動(dòng)轉(zhuǎn)換為 Mb/s)。
無邊框透明窗口:
- 使用 PyQt5 提供的 QWidget,設(shè)置為透明背景和無邊框窗口,方便嵌入桌面環(huán)境且不干擾其他應(yīng)用程序顯示。 始終置頂顯示:
- 窗口設(shè)置為始終置頂,即使用戶在其他應(yīng)用程序之間切換,速度監(jiān)控窗口也會(huì)保持在前面顯示。 自定義字體與樣式:
- 字體采用系統(tǒng)默認(rèn)的 “Segoe UI” 字體,并且設(shè)置為加粗樣式,確保文字清晰易讀。
- 上傳和下載速度分別使用不同的顏色,增強(qiáng)視覺區(qū)分度。
可拖動(dòng)窗口:
- 支持通過鼠標(biāo)拖動(dòng)窗口,用戶可以長(zhǎng)按窗口頂部部分來自由移動(dòng)窗口位置。
- 拖動(dòng)靈敏度可調(diào),用戶可根據(jù)需求增加拖動(dòng)區(qū)域的高度以便更容易拖動(dòng)窗口。
屏幕右下角默認(rèn)位置:
程序啟動(dòng)后,窗口會(huì)自動(dòng)定位到屏幕的右下角,并且不會(huì)被其他窗口遮擋。
后臺(tái)線程處理數(shù)據(jù)獲?。?/p>
使用 QThread 來處理網(wǎng)絡(luò)流量數(shù)據(jù)的獲取,避免阻塞主線程,從而保持用戶界面的響應(yīng)性。
技術(shù)棧
PyQt5:用于創(chuàng)建圖形界面和處理用戶交互。
psutil:用于獲取網(wǎng)絡(luò)流量統(tǒng)計(jì)數(shù)據(jù)(如上傳和下載字節(jié)數(shù))。
QThread:用于異步獲取網(wǎng)絡(luò)數(shù)據(jù),以確保UI的流暢更新。
該程序的設(shè)計(jì)旨在為用戶提供一個(gè)簡(jiǎn)單、直觀的實(shí)時(shí)網(wǎng)絡(luò)流量監(jiān)控工具,同時(shí)保持界面的干凈、透明和可定制性,滿足日常監(jiān)控需求。
2. 運(yùn)行效果
3. 相關(guān)源碼
#!/usr/bin/python from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QDesktopWidget from PyQt5.QtGui import QCursor, QFont from PyQt5.QtCore import Qt, QThread, pyqtSignal, QTimer import psutil import sys class Speed(QWidget): def __init__(self): super(Speed, self).__init__() self.initUI() self.worker = MyWorker() self.worker.timeout.connect(self.update_speed) self.worker.start() def initUI(self): """初始化UI""" self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_TranslucentBackground) self.resize(160, 70) # 上傳和下載標(biāo)簽 self.up = QLabel(self) self.down = QLabel(self) self.up.setGeometry(5, 5, 160, 20) self.down.setGeometry(5, 28, 160, 20) # 設(shè)置字體(使用 Segoe UI 系統(tǒng)字體) font = QFont("Segoe UI", 15, QFont.Bold) self.up.setFont(font) self.down.setFont(font) # 設(shè)置文字顏色和樣式 self.up.setStyleSheet("color:#e1b16a") self.down.setStyleSheet("color:#ce4a57") self.setStyleSheet("QLabel{font-size:15px;font-weight:bold}") # 設(shè)置窗口默認(rèn)位置在屏幕右下角 self.set_window_position() # 顯示窗口 self.show() # 拖動(dòng)靈敏度設(shè)置:增加拖動(dòng)區(qū)域的高度,使其更大 self.drag_sensitivity = 35 # 擴(kuò)大拖動(dòng)區(qū)域,默認(rèn)為35 def set_window_position(self): """將窗口設(shè)置到屏幕右下角""" screen_geometry = QDesktopWidget().availableGeometry() screen_width = screen_geometry.width() screen_height = screen_geometry.height() window_width = self.width() window_height = self.height() x_position = screen_width - window_width - 10 # 右邊距 10 y_position = screen_height - window_height - 10 # 下邊距 10 self.move(x_position, y_position) def update_speed(self, speed_data): """更新上傳和下載速度顯示""" upload_speed, download_speed = speed_data # 上傳速度顯示 upload_text = f"上傳 {upload_speed:.2f} {'Kb/s' if upload_speed < 1024 else 'Mb/s'}" self.up.setText(upload_text) # 下載速度顯示 download_text = f"下載 {download_speed:.2f} {'Kb/s' if download_speed < 1024 else 'Mb/s'}" self.down.setText(download_text) def mousePressEvent(self, event): """鼠標(biāo)按下事件,開始拖動(dòng)窗口""" if event.button() == Qt.LeftButton and event.pos().y() < self.drag_sensitivity: self.m_flag = True self.m_Position = event.globalPos() - self.pos() event.accept() self.setCursor(QCursor(Qt.OpenHandCursor)) def mouseMoveEvent(self, event): """鼠標(biāo)移動(dòng)事件,拖動(dòng)窗口""" if Qt.LeftButton and self.m_flag: self.move(event.globalPos() - self.m_Position) event.accept() def mouseReleaseEvent(self, event): """鼠標(biāo)釋放事件,停止拖動(dòng)窗口""" self.m_flag = False self.setCursor(QCursor(Qt.ArrowCursor)) class MyWorker(QThread): timeout = pyqtSignal(list) def __init__(self): super(MyWorker, self).__init__() self.previous_upload = 0 self.previous_download = 0 def run(self): """周期性獲取網(wǎng)絡(luò)流量數(shù)據(jù)并發(fā)射信號(hào)""" while True: try: net_io = psutil.net_io_counters() upload_speed = (net_io.bytes_sent - self.previous_upload) / 1024.0 # Kb/s download_speed = (net_io.bytes_recv - self.previous_download) / 1024.0 # Kb/s # 更新上次的發(fā)送和接收字節(jié)數(shù) self.previous_upload = net_io.bytes_sent self.previous_download = net_io.bytes_recv # 發(fā)射信號(hào)更新UI self.timeout.emit([upload_speed, download_speed]) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e: print(f"Error: {e}") self.sleep(1) # 每秒更新一次 if __name__ == '__main__': app = QApplication(sys.argv) speed_monitor = Speed() sys.exit(app.exec_())
到此這篇關(guān)于基于Python開發(fā)網(wǎng)絡(luò)速度監(jiān)控工具的文章就介紹到這了,更多相關(guān)Python網(wǎng)絡(luò)速度監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python+Pyqt5開發(fā)一個(gè)應(yīng)用程序
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著Python+Pyqt5開發(fā)一個(gè)應(yīng)用程序展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06python利用beautifulSoup實(shí)現(xiàn)爬蟲
這篇文章主要介紹了python利用beautifulSoup實(shí)現(xiàn)爬蟲,需要的朋友可以參考下2014-09-09Python對(duì)象轉(zhuǎn)換為json的方法步驟
這篇文章主要介紹了Python對(duì)象轉(zhuǎn)換為json的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04python時(shí)間日期操作方法實(shí)例小結(jié)
這篇文章主要介紹了python時(shí)間日期操作方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)日期時(shí)間的轉(zhuǎn)換、計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2020-02-02Python中統(tǒng)計(jì)函數(shù)運(yùn)行耗時(shí)的方法
這篇文章主要介紹了Python中統(tǒng)計(jì)函數(shù)運(yùn)行耗時(shí)的方法,涉及Python時(shí)間操作的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05Django+python服務(wù)器部署與環(huán)境部署教程詳解
這篇文章主要介紹了Django+python服務(wù)器部署與環(huán)境部署教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03