python百行程式碼自制電腦端網速懸浮窗的實現
阿新 • • 發佈:2020-05-13
前言
看到某60的網速懸浮球有點心動,但是又不想裝這個流氓軟體,就自己用python加PyQt5自制了一個,實測還行,關鍵不佔用電腦一點資源,已將軟體打包,可自行下載使用。
預覽
觀看直播時實時網速。
檔案結構
執行管理
開始執行時記憶體消耗18.3m,cpu,磁碟,網路不佔用。
執行一天後記憶體穩定於6.4m,cpu,磁碟,網路不佔用。
整體思路
- 使用psuti.net_io_counters 監控電腦網絡卡IO
- 將流量資料格式化,統計每次資料總和儲存在本地《流量使用情況.txt》(這個是個缺陷,我只用txt儲存,使用者可以隨意更改,後期完善一下加密儲存,隱藏檔案資訊。)
- PyQt視窗製作,兩個label,一個網速資訊,一個動態圖展示,隱藏視窗標題欄,工作列,視窗全螢幕隨意移動,滑鼠放到視窗樣式變為抓手,滑鼠右鍵選單欄,退出程式,軟體關於。
- 退出程式時儲存流量總和資訊到檔案,下次啟動先讀取流量總和資料。
程式碼清單
網速獲取&&格式化
def gsh(count): if count < 1024: return "%.2f B/s" % count if count < 1048576: return "%.2f KB/s" % (count / 1024) count >>= 10 if count < 1048576: return "%.2f MB/s" % (count / 1024) count >>= 10 return "%.2f GB/s" % (count / 1024) def get_data(): old = [0,0] new = [0,0] net_info = net_io_counters() # 獲取流量統計資訊 recv_bytes = net_info.bytes_recv sent_bytes = net_info.bytes_sent old[0] += recv_bytes old[1] += sent_bytes time.sleep(1) # 當前所收集的資料 net_info = net_io_counters() # 獲取流量統計資訊 recv_bytes = net_info.bytes_recv sent_bytes = net_info.bytes_sent new[0] += recv_bytes new[1] += sent_bytes info = [] for i in range(2): info.append(new[i] - old[i]) return info
視窗介面
class Main(QWidget): _startPos = None _endPos = None _isTracking = False all_bytes=0 about = "監控電腦網路的上傳跟下載網速。\n統計網路使用總流量!\n作者:旋凱凱旋" def __init__(self): super().__init__() self._initUI() with open('流量使用情況.txt','r') as f: self.all_bytes = int(f.read()) def _initUI(self): self.setFixedSize(QSize(259,270)) self.setWindowFlags(Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint | Qt.Tool) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 設定視窗背景透明 self.label = QtWidgets.QLabel(self) self.label.setGeometry(QtCore.QRect(0,259,111)) self.label.setMinimumSize(QtCore.QSize(259,111)) self.label.setBaseSize(QtCore.QSize(259,111)) self.label.setStyleSheet("font: 75 20pt \"Adobe Arabic\";color:rgb(255,0)") self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.label2 = QtWidgets.QLabel(self) self.label2.setGeometry(QtCore.QRect(10,110,161)) self.label2.setMinimumSize(QtCore.QSize(259,161)) self.label2.setBaseSize(QtCore.QSize(259,161)) self.label2.setAlignment(QtCore.Qt.AlignCenter) self.gif = QMovie('1271.gif') self.label2.setMovie(self.gif) self.label2.setObjectName("label2") self.gif.start() self.timer = QtCore.QTimer(self) self.timer.start(1000) self.timer.timeout.connect(self.start) self.setCursor(QCursor(Qt.PointingHandCursor)) self.show()
邏輯函式
def start(self): Thread(target=self.setSpeed,daemon=True).start() def setSpeed(self): info = get_data() recv_bytes = gsh(info[0]) # 每秒接收的位元組 sent_bytes = gsh(info[1]) # 每秒傳送的位元組 self.all_bytes += sum(info) if self.all_bytes<1073741824: all_bytes = self.all_bytes / 1048576 strs="已使用:%.2f Mb"%all_bytes else: all_bytes = self.all_bytes / 1073741824 strs = "已使用:%.2f Gb" % all_bytes self.label.setText("上傳:%s\n下載:%s\n%s"%(sent_bytes,recv_bytes,strs)
滑鼠事件
def mouseMoveEvent(self,e: QMouseEvent): # 重寫移動事件 self._endPos = e.pos() - self._startPos self.move(self.pos() + self._endPos) def mousePressEvent(self,e: QMouseEvent): if e.button() == Qt.LeftButton: self._isTracking = True self._startPos = QPoint(e.x(),e.y()) if e.button() == Qt.RightButton: menu = QMenu(self) quitAction = menu.addAction("退出程式") aboutAction=menu.addAction("關於程式") action = menu.exec_(self.mapToGlobal(e.pos())) if action == quitAction: with open('流量使用情況.txt','w') as f: f.write(str(self.all_bytes)) qApp.quit() if action == aboutAction: msg_box = QtWidgets.QMessageBox msg_box.question(self,"關於",self.about,msg_box.Yes | msg_box.Cancel) if QMessageBox.Yes: webbrowser.open('https://me.csdn.net/Cxk___',new=0,autoraise=True) def mouseReleaseEvent(self,e: QMouseEvent): if e.button() == Qt.LeftButton: self._isTracking = False self._startPos = None self._endPos = None if e.button() == Qt.RightButton: self._isTracking = False self._startPos = None self._endPos = None
庫
# -*- coding: utf-8 -*- import time import webbrowser from PyQt5.QtCore import QSize,QPoint,Qt from PyQt5.QtGui import QMouseEvent,QMovie,QCursor from PyQt5.QtWidgets import QWidget,QMessageBox,QApplication,QMenu,qApp from psutil import net_io_counters #net_io_counters 網路輸入與輸出 如果需要獲取單個網絡卡的io資訊,加上pernic=True引數。 from threading import Thread import sys from qtpy import QtWidgets,QtCore
執行
if __name__ == '__main__': app = QApplication(sys.argv) ex = Main() sys.exit(app.exec_()
到此這篇關於python百行程式碼自制電腦端網速懸浮窗的實現的文章就介紹到這了,更多相關python 電腦端網速懸浮窗內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!