python百行代碼自制電腦端網速懸浮窗

前言

看到某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, 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,0)")
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")

        self.label2 = QtWidgets.QLabel(self)
        self.label2.setGeometry(QtCore.QRect(10, 110, 259, 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_()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章