python百行代码自制电脑端网速悬浮窗的实现


Posted in Python onMay 12, 2020

前言

看到某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, 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_()

到此这篇关于python百行代码自制电脑端网速悬浮窗的实现的文章就介绍到这了,更多相关python 电脑端网速悬浮窗内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
Python解析nginx日志文件
May 11 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
对python文件读写的缓冲行为详解
Feb 13 Python
Python数据类型之Number数字操作实例详解
May 08 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
Oct 11 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 Python
学点简单的Django之第一个Django程序的实现
Feb 24 Python
基于Python的Jenkins的二次开发操作
May 12 #Python
Python-jenkins模块获取jobs的执行状态操作
May 12 #Python
Python-jenkins 获取job构建信息方式
May 12 #Python
python进行参数传递的方法
May 12 #Python
python输出数学符号实例
May 11 #Python
使用matlab 判断两个矩阵是否相等的实例
May 11 #Python
Django models文件模型变更错误解决
May 11 #Python
You might like
用PHP读注册表
2006/10/09 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
使用正则替换变量
2007/05/05 Javascript
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
openlayers实现地图测距测面
2020/09/25 Javascript
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
Java程序员综合测试题
2014/04/25 面试题
银行个人求职自荐信范文
2013/12/16 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
优秀经理获奖感言
2014/03/04 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
机械操作工岗位职责
2014/08/08 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript