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读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
python删除字符串中指定字符的方法
Aug 13 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
Python爬虫爬取新闻资讯案例详解
Jul 14 Python
Python threading模块condition原理及运行流程详解
Oct 05 Python
python实现一个简单RPC框架的示例
Oct 28 Python
Python实现微信表情包炸群功能
Jan 28 Python
python实现简单的学生管理系统
Feb 22 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数组交集的优化代码分析
2011/03/06 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
学习ExtJS Panel常用方法
2009/10/07 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
2017/07/19 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
vue项目国际化vue-i18n的安装使用教程
2018/03/14 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
法警的竞聘演讲稿
2014/01/02 职场文书
新年主持词
2014/03/27 职场文书
学历公证书范本
2014/04/09 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
无罪辩护词范文
2015/05/21 职场文书
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript
nginx配置之并发频次限制
2022/04/18 Servers
Go web入门Go pongo2模板引擎
2022/05/20 Golang
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android