1. 程式人生 > 程式設計 >python百行程式碼自制電腦端網速懸浮窗的實現

python百行程式碼自制電腦端網速懸浮窗的實現

前言

看到某60的網速懸浮球有點心動,但是又不想裝這個流氓軟體,就自己用python加PyQt5自制了一個,實測還行,關鍵不佔用電腦一點資源,已將軟體打包,可自行下載使用。

預覽

觀看直播時實時網速。

python百行程式碼自制電腦端網速懸浮窗的實現

檔案結構

python百行程式碼自制電腦端網速懸浮窗的實現

執行管理

開始執行時記憶體消耗18.3m,cpu,磁碟,網路不佔用。

python百行程式碼自制電腦端網速懸浮窗的實現

執行一天後記憶體穩定於6.4m,cpu,磁碟,網路不佔用。

python百行程式碼自制電腦端網速懸浮窗的實現

整體思路

  • 使用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 電腦端網速懸浮窗內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!