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 相关文章推荐
python中循环语句while用法实例
May 16 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
对pandas replace函数的使用方法小结
May 18 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
python解析xml简单示例
Jun 21 Python
python中对数据进行各种排序的方法
Jul 02 Python
实例详解Python装饰器与闭包
Jul 29 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
Jul 31 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python使用递归的方式建立二叉树
2019/07/03 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python中tab键是什么意思
2020/06/18 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
CSS3 calc()会计算属性详解
2018/02/27 HTML / CSS
信用社实习人员自我鉴定
2013/09/20 职场文书
三年级数学教学反思
2014/01/31 职场文书
《木笛》教学反思
2014/03/01 职场文书
保密工作目标责任书
2014/07/28 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
党员带头倡议书
2015/04/29 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
MySQL普通表如何转换成分区表
2022/05/30 MySQL