基于Python开发网络速度监控工具

 更新时间:2025年01月19日 13:36:18   作者:黑客白泽  
这篇文章主要为大家详细介绍了如何基于 PyQt5 框架开发一个实时网络速度监控工具,能够显示当前设备的上传和下载速度,感兴趣的小伙伴可以了解下

1. 简介

这个程序是一个基于 PyQt5 框架开发的实时网络速度监控工具,能够显示当前设备的上传和下载速度。它以一个小巧的窗口形式展示,默认位置为屏幕的右下角,且窗口始终置顶。程序的显示内容包括上传和下载的网络速度,并支持通过鼠标拖动移动窗口。

功能介绍

实时网络速度监控:

  • 通过 psutil 库获取当前设备的网络流量数据,包括上传和下载的字节数。
  • 每秒刷新一次上传和下载速度,单位为 Kb/s 或 Mb/s(当速度超过 1MB/s时自动转换为 Mb/s)。

无边框透明窗口:

  • 使用 PyQt5 提供的 QWidget,设置为透明背景和无边框窗口,方便嵌入桌面环境且不干扰其他应用程序显示。 始终置顶显示:
  • 窗口设置为始终置顶,即使用户在其他应用程序之间切换,速度监控窗口也会保持在前面显示。 自定义字体与样式:
  • 字体采用系统默认的 “Segoe UI” 字体,并且设置为加粗样式,确保文字清晰易读。
  • 上传和下载速度分别使用不同的颜色,增强视觉区分度。

可拖动窗口:

  • 支持通过鼠标拖动窗口,用户可以长按窗口顶部部分来自由移动窗口位置。
  • 拖动灵敏度可调,用户可根据需求增加拖动区域的高度以便更容易拖动窗口。

屏幕右下角默认位置:

程序启动后,窗口会自动定位到屏幕的右下角,并且不会被其他窗口遮挡。

后台线程处理数据获取:

使用 QThread 来处理网络流量数据的获取,避免阻塞主线程,从而保持用户界面的响应性。

技术栈

PyQt5:用于创建图形界面和处理用户交互。

psutil:用于获取网络流量统计数据(如上传和下载字节数)。

QThread:用于异步获取网络数据,以确保UI的流畅更新。

该程序的设计旨在为用户提供一个简单、直观的实时网络流量监控工具,同时保持界面的干净、透明和可定制性,满足日常监控需求。

2. 运行效果

3. 相关源码

#!/usr/bin/python
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QDesktopWidget
from PyQt5.QtGui import QCursor, QFont
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QTimer
import psutil
import sys

class Speed(QWidget):
    def __init__(self):
        super(Speed, self).__init__()
        self.initUI()
        self.worker = MyWorker()
        self.worker.timeout.connect(self.update_speed)
        self.worker.start()

    def initUI(self):
        """初始化UI"""
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.resize(160, 70)

        # 上传和下载标签
        self.up = QLabel(self)
        self.down = QLabel(self)
        
        self.up.setGeometry(5, 5, 160, 20)
        self.down.setGeometry(5, 28, 160, 20)

        # 设置字体(使用 Segoe UI 系统字体)
        font = QFont("Segoe UI", 15, QFont.Bold)
        self.up.setFont(font)
        self.down.setFont(font)

        # 设置文字颜色和样式
        self.up.setStyleSheet("color:#e1b16a")
        self.down.setStyleSheet("color:#ce4a57")
        self.setStyleSheet("QLabel{font-size:15px;font-weight:bold}")
        
        # 设置窗口默认位置在屏幕右下角
        self.set_window_position()

        # 显示窗口
        self.show()

        # 拖动灵敏度设置:增加拖动区域的高度,使其更大
        self.drag_sensitivity = 35  # 扩大拖动区域,默认为35

    def set_window_position(self):
        """将窗口设置到屏幕右下角"""
        screen_geometry = QDesktopWidget().availableGeometry()
        screen_width = screen_geometry.width()
        screen_height = screen_geometry.height()

        window_width = self.width()
        window_height = self.height()
        x_position = screen_width - window_width - 10  # 右边距 10
        y_position = screen_height - window_height - 10  # 下边距 10

        self.move(x_position, y_position)

    def update_speed(self, speed_data):
        """更新上传和下载速度显示"""
        upload_speed, download_speed = speed_data

        # 上传速度显示
        upload_text = f"上传 {upload_speed:.2f} {'Kb/s' if upload_speed < 1024 else 'Mb/s'}"
        self.up.setText(upload_text)

        # 下载速度显示
        download_text = f"下载 {download_speed:.2f} {'Kb/s' if download_speed < 1024 else 'Mb/s'}"
        self.down.setText(download_text)

    def mousePressEvent(self, event):
        """鼠标按下事件,开始拖动窗口"""
        if event.button() == Qt.LeftButton and event.pos().y() < self.drag_sensitivity:
            self.m_flag = True
            self.m_Position = event.globalPos() - self.pos()
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))

    def mouseMoveEvent(self, event):
        """鼠标移动事件,拖动窗口"""
        if Qt.LeftButton and self.m_flag:
            self.move(event.globalPos() - self.m_Position)
            event.accept()

    def mouseReleaseEvent(self, event):
        """鼠标释放事件,停止拖动窗口"""
        self.m_flag = False
        self.setCursor(QCursor(Qt.ArrowCursor))


class MyWorker(QThread):
    timeout = pyqtSignal(list)

    def __init__(self):
        super(MyWorker, self).__init__()
        self.previous_upload = 0
        self.previous_download = 0

    def run(self):
        """周期性获取网络流量数据并发射信号"""
        while True:
            try:
                net_io = psutil.net_io_counters()
                upload_speed = (net_io.bytes_sent - self.previous_upload) / 1024.0  # Kb/s
                download_speed = (net_io.bytes_recv - self.previous_download) / 1024.0  # Kb/s

                # 更新上次的发送和接收字节数
                self.previous_upload = net_io.bytes_sent
                self.previous_download = net_io.bytes_recv

                # 发射信号更新UI
                self.timeout.emit([upload_speed, download_speed])
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e:
                print(f"Error: {e}")
            self.sleep(1)  # 每秒更新一次


if __name__ == '__main__':
    app = QApplication(sys.argv)
    speed_monitor = Speed()
    sys.exit(app.exec_())

到此这篇关于基于Python开发网络速度监控工具的文章就介绍到这了,更多相关Python网络速度监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python网络编程学习笔记(一)

    python网络编程学习笔记(一)

    这篇文章主要介绍了python网络编程基础知识,需要的朋友可以参考下
    2014-06-06
  • Python使用Pandas对csv文件进行数据处理的方法

    Python使用Pandas对csv文件进行数据处理的方法

    这篇文章主要介绍了Python使用Pandas对csv文件进行数据处理的方法,本文通过实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python Dask库处理大规模数据集的强大功能实战

    Python Dask库处理大规模数据集的强大功能实战

    Dask是一个灵活、开源的Python库,专为处理大规模数据集而设计,与传统的单机计算相比,Dask能够在分布式系统上运行,有效利用集群的计算资源,本文将深入介绍Dask的核心概念、功能和实际应用,通过丰富的示例代码展示其在大数据处理领域的强大能力
    2023-12-12
  • 基于python求两个列表的并集.交集.差集

    基于python求两个列表的并集.交集.差集

    这篇文章主要介绍了基于python求两个列表的并集.交集.差集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • python实现区间合并的方法

    python实现区间合并的方法

    区间合并是指将重叠的区间合并为一个或多个不重叠的区间,本文主要介绍了python实现区间合并的方法,文中通过代码介绍的很详细,感兴趣的可以了解一下
    2024-02-02
  • Python实现生成bmp图像的方法

    Python实现生成bmp图像的方法

    本文主要介绍了Python实现生成bmp图像的方法,对大家的学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 使用Python处理CSV文件的全面指南

    使用Python处理CSV文件的全面指南

    在数据驱动开发中,‌结构化存储‌是数据处理流程的关键环节,CSV作为一种轻量级、跨平台的文件格式,广泛用于数据交换、日志记录及中小规模数据存储,本文将介绍如何使用 Python 处理 CSV 文件,需要的朋友可以参考下
    2025-07-07
  • 修改 CentOS 6.x 上默认Python的方法

    修改 CentOS 6.x 上默认Python的方法

    这篇文章主要介绍了修改 CentOS 6.x 上默认Python的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Python中获取网页状态码的两个方法

    Python中获取网页状态码的两个方法

    这篇文章主要介绍了Python中获取网页状态码的两个方法,分别使用urllib模块和requests模块实现,需要的朋友可以参考下
    2014-11-11
  • python使用生成器实现可迭代对象

    python使用生成器实现可迭代对象

    这篇文章主要为大家详细介绍了python如何使用生成器实现可迭代对象,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论