python百行代码自制电脑端网速悬浮窗的实现
作者:旋凯凯旋 发布时间:2023-02-03 21:52:57
标签:python,电脑端,网速悬浮窗
前言
看到某60的网速悬浮球有点心动,但是又不想装这个流氓软件,就自己用python加PyQt5自制了一个,实测还行,关键不占用电脑一点资源,已将软件打包,可自行下载使用。
预览
观看直播时实时网速。
文件结构
运行管理
开始运行时内存消耗18.3m,cpu,磁盘,网络不占用。
运行一天后内存稳定于6.4m,cpu,磁盘,网络不占用。
整体思路
使用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_()
来源:https://blog.csdn.net/Cxk___/article/details/106068456


猜你喜欢
- 1.建立项目,进入项目文件夹2.初始化ssh key 参见官网指南.(本机生成一对key,public key传到官网sshkey下面)ht
- 前言在linux有个命令叫做md5sum,能生成文件的md5值,一般情况下都会将结果记录到一个文件中用于校验使用,比如会这样使用:[craz
- 在使用Matplotlib 绘制饼图的时候有些时候一些数据的比列太小在饼图呈现的效果不明显 很容易被覆盖,为了解决这个问题以下就是我个人的心
- <script language="javascript" type="text/javascript&
- 文件下载(遇到的坑)1.要区分下载的内容是什么0.1 图片下载wx.saveImageToPhotosAlbum(Object
- 字符串操作字符串 + 运算符+运算符用于连接字符串,返回一个由连接在一起的操作数组成的字符串。>>> s = 'a
- bool assert ( mixed $assertion [, string $description ] ) — 检查一个断言是否为
- 关于ref和$refs的用法及讲解,vue.js中文社区( https://cn.vuejs.org/v2/api/#ref )是这么讲解的
- 本文将介绍PHP中单引号和双引号的区别。PHP中单引号和双引号简介在 PHP 中,我们使用引号来指定值是字符串文字。有两种不同类型的报价。它
- 前言点击视频讲解更加详细this.$route:当前激活的路由的信息对象。每个对象都是局部的,可以获取当前路由的 path, na
- 开发过程中总避免不了遇到恶心的乱码,或者由乱码引发的一系列问题。出现乱码是字符集的原因一般而言和逻辑没有太大关系,也就是说整个系统大的方向没
- 列表UL或是OL中都有一个预设标记,这个标记可能是实点圆点,也可能是数字。在实际的应用中,我们需要去掉这个预设标记,但我们不清楚这个预设标记
- 我们都知道当我们建立数据表(innodb或myisam)时,会生成相应的文件(如:MYD,MYI,frm) 在这里,我们探讨下使用frm文件
- 错误信息PS D:\parttime\python\django\guanxiangzhiji> python manage.py m
- 分享人:月漓作为交互设计师,你是否在一个项目中花费大量的时间来沟通、修改、明确需求?其实这些前期工作(设计原型前)是我们和PD、运营、开发之
- 我其实是同一天看到Robert Treat几人整理的”Mysql 迁移到Oracle前需要了解的50件事“与Baron Schwartz的”
- 本文实例讲述了python分支、循环简单用法。分享给大家供大家参考,具体如下:讲程序设计,不得不讲到顺序、分支、循环。顺序就是从上到下运行代
- 一、控制用户存取 1、创建修改用户Creating Users Create/alter user new_user identified
- 本文实例讲述了python实现在控制台输入密码不显示的方法。分享给大家供大家参考。具体实现方法如下:import console;names
- 遍历指定文件夹下的文件,根据文件后缀名,获取指定类型的文件列表;根据文件列表里的文件路径,逐个获取文件属性里的“修改时间”,如果“修改时间”