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生成随机验证码(中文验证码)示例
Apr 03 Python
Python中的闭包实例详解
Aug 29 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
浅谈function(函数)中的动态参数
Apr 30 Python
在dataframe两列日期相减并且得到具体的月数实例
Jul 03 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
python面试题小结附答案实例代码
Apr 11 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Django发送邮件功能实例详解
Sep 02 Python
python实现扫雷游戏
Mar 03 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 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大转盘中奖概率算法实例
2014/10/21 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
2019/04/02 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python 数据加密代码
2008/12/24 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python3 翻转二叉树的实现
2019/09/30 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Python requests模块session代码实例
2020/04/14 Python
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
大学生的网上创业计划书
2013/12/31 职场文书
旷课检讨书3000字
2014/02/04 职场文书
个人委托书格式
2014/04/04 职场文书
党员学习型组织心得体会
2019/06/21 职场文书