网络编程
位置:首页>> 网络编程>> Python编程>> Python PyQt5实战项目之网速监控器的实现

Python PyQt5实战项目之网速监控器的实现

作者:不侠居  发布时间:2023-05-25 12:57:07 

标签:Python,PyQt5,网速监控器

简介

看到了一个能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息的模块–psutil模块。这次利用psutil.net_io_counters()这个方法。

psutil模块使用

>>> psutil.net_io_counters() # 获取网络读写字节/包的个数

snetio(bytes_sent=16775953, bytes_recv=712657945, packets_sent=216741, packets_recv=485775, errin=0, errout=0, dropin=0, dropout=0)

bytes_sent:上传数据
bytes_recv: 接收数据

主界面


class NetWindows(QMainWindow):
   net_signal = pyqtSignal(str,str)
   def __init__(self):
       super(NetWindows,self).__init__()
       self.ui_init()  
       self.thread_init()

def ui_init(self):
       self.setWindowTitle('网速')
       self.resize(200,80)
       self.setWindowOpacity(0.9) # 设置窗口透明度
       self.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框
       self.setWindowFlag(Qt.WindowStaysOnTopHint) # 窗口始终显示在最前面
       self.upload_icon = QLabel()
       self.upload_icon.setPixmap(QPixmap(':res/upload.png'))
       self.upload_icon.setScaledContents(True)
       self.download_icon = QLabel()
       self.download_icon.setPixmap(QPixmap(':res/download.png'))
       self.download_icon.setScaledContents(True)
       self.upload_text = QLabel()
       self.upload_text.setText('upload: ')
       self.download_text = QLabel()
       self.download_text.setText('download: ')

self.upload_lab = QLabel()
       self.download_lab = QLabel()

self.g_layout = QGridLayout()
       self.g_layout.addWidget(self.upload_icon,0,0,1,1)
       self.g_layout.addWidget(self.download_icon,1,0,1,1)
       self.g_layout.addWidget(self.upload_text,0,1,1,1)
       self.g_layout.addWidget(self.download_text,1,1,1,1)
       self.g_layout.addWidget(self.upload_lab,0,2,1,4)
       self.g_layout.addWidget(self.download_lab,1,2,1,4)
       self.widget = QWidget()
       self.widget.setLayout(self.g_layout)
       self.setCentralWidget(self.widget)

def thread_init(self):
       self.net_thread = NetThread()
       self.net_thread.net_signal.connect(self.net_slot)
       self.net_thread.start(1000)

def variate_init(self):
       self.upload_content = ''
       self.download_content = ''

def net_slot(self,upload_content,download_content):
       self.upload_lab.setText(upload_content)
       self.download_lab.setText(download_content)

def mousePressEvent(self, event):
       '''
       重写按下事件
       '''                            
       self.start_x = event.x()                        
       self.start_y = event.y()

def mouseMoveEvent(self, event):
       '''
       重写移动事件
       '''                              
       dis_x = event.x() - self.start_x
       dis_y = event.y() - self.start_y
       self.move(self.x()+dis_x, self.y()+dis_y)
  • mousePressEvent()

获取鼠标按下时的坐标位置(相对于窗口左上角)

  • mouseMoveEvent()

当鼠标处于按下状态并开始移动时,鼠标离窗口左上角的位置会不断更新并保存在event.x()和event.y()中。
我们将更新后的x和y值不断减去鼠标按下时的坐标位置,就可以知道鼠标移动的距离。最后再调用move方法将窗口当前坐标加上移动距离即可

网速线程


class NetThread(QThread):
   net_signal = pyqtSignal(str,str)
   def __init__(self):
       super(NetThread,self).__init__()

def net_func(self):
       parameter = psutil.net_io_counters()
       recv1 = parameter[1] #接收数据
       send1 = parameter[0] #上传数据
       time.sleep(1)  # 每隔1s监听端口接收数据
       parameter = psutil.net_io_counters()
       recv2 = parameter[1]
       send2 = parameter[0]
       self.upload_content = '{:.1f} kb/s.'.format((send2 - send1) / 1024.0)
       self.download_content = '{:.1f} kb/s.'.format((recv2 - recv1) / 1024.0)

def run(self):
       while(1):
           self.net_func()
           self.net_signal.emit(self.upload_content,self.download_content)
           time.sleep(1)

全部代码


import sys
import time
import psutil

from PyQt5.QtWidgets import QApplication, QHBoxLayout, QMainWindow, QWidget, QFrame, QLabel, QVBoxLayout, QGridLayout
from PyQt5.QtCore import Qt, pyqtSignal, QThread
from PyQt5.QtGui import QPixmap
import res

class NetWindows(QMainWindow):
   net_signal = pyqtSignal(str,str)
   def __init__(self):
       super(NetWindows,self).__init__()
       self.ui_init()  
       self.thread_init()

def ui_init(self):
       self.setWindowTitle('网速')
       self.resize(200,80)
       self.setWindowOpacity(0.9) # 设置窗口透明度
       self.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框
       self.setWindowFlag(Qt.WindowStaysOnTopHint) # 窗口始终显示在最前面
       self.upload_icon = QLabel()
       self.upload_icon.setPixmap(QPixmap(':res/upload.png'))
       self.upload_icon.setScaledContents(True)
       self.download_icon = QLabel()
       self.download_icon.setPixmap(QPixmap(':res/download.png'))
       self.download_icon.setScaledContents(True)
       self.upload_text = QLabel()
       self.upload_text.setText('upload: ')
       self.download_text = QLabel()
       self.download_text.setText('download: ')

self.upload_lab = QLabel()
       self.download_lab = QLabel()

self.g_layout = QGridLayout()
       self.g_layout.addWidget(self.upload_icon,0,0,1,1)
       self.g_layout.addWidget(self.download_icon,1,0,1,1)
       self.g_layout.addWidget(self.upload_text,0,1,1,1)
       self.g_layout.addWidget(self.download_text,1,1,1,1)
       self.g_layout.addWidget(self.upload_lab,0,2,1,4)
       self.g_layout.addWidget(self.download_lab,1,2,1,4)
       self.widget = QWidget()
       self.widget.setLayout(self.g_layout)
       self.setCentralWidget(self.widget)

def thread_init(self):
       self.net_thread = NetThread()
       self.net_thread.net_signal.connect(self.net_slot)
       self.net_thread.start(1000)

def variate_init(self):
       self.upload_content = ''
       self.download_content = ''

def net_slot(self,upload_content,download_content):
       self.upload_lab.setText(upload_content)
       self.download_lab.setText(download_content)

def mousePressEvent(self, event):
       '''
       重写按下事件
       '''                            
       self.start_x = event.x()                        
       self.start_y = event.y()

def mouseMoveEvent(self, event):
       '''
       重写移动事件
       '''                              
       dis_x = event.x() - self.start_x
       dis_y = event.y() - self.start_y
       self.move(self.x()+dis_x, self.y()+dis_y)

class NetThread(QThread):
   net_signal = pyqtSignal(str,str)
   def __init__(self):
       super(NetThread,self).__init__()

def net_func(self):
       parameter = psutil.net_io_counters()
       recv1 = parameter[1] #接收数据
       send1 = parameter[0] #上传数据
       time.sleep(1)  # 每隔1s监听端口接收数据
       parameter = psutil.net_io_counters()
       recv2 = parameter[1]
       send2 = parameter[0]
       self.upload_content = '{:.1f} kb/s.'.format((send2 - send1) / 1024.0)
       self.download_content = '{:.1f} kb/s.'.format((recv2 - recv1) / 1024.0)

def run(self):
       while(1):
           self.net_func()
           self.net_signal.emit(self.upload_content,self.download_content)
           time.sleep(1)

if __name__ == '__main__':
   app = QApplication(sys.argv)
   dispaly = NetWindows()
   dispaly.show()
   netwidows = NetWindows()
   sys.exit(app.exec_())

成果展示

Python PyQt5实战项目之网速监控器的实现

Python PyQt5实战项目之网速监控器的实现

来源:https://blog.csdn.net/m0_46778548/article/details/115769459

0
投稿

猜你喜欢

  • 网页设计是由很多个不同的元素构成的,而这些元素的重要性都不同,并且有些元素还需要尤为的突出.有些元素彼此之间存在着联系,而另外的元素之间则一
  • 几乎每个程序都需要用到图片,在小程序中我们可以通过image组件显示图片。当然小程序也是可以上传图片的,微信小程序文档也写的很清楚。上传图片
  • 在使用easyUI做前端样式展示时,遇到了文件上传的问题,而且是在弹出层中提交表单,想做到不刷新页面,所以选择了使用ajaxFileUplo
  • 一、原因:今天在尝试初始化一个WEB应用的时候,发现其连接不上MySQL,从Traceback看到使用的默认密码为‘YES’。没辙,居然尝试
  • 这次自己做了一个小程序来玩,在登录方面一直有些模糊,网上看了很多文档后,得出以下一种解决方案。环境说明:1、小程序只需要拿到openid,其
  • 本文实例分析了LINUX下Oracle数据库用户创建方法。分享给大家供大家参考,具体如下:1)登录linux,以oracle用户登录(如果是
  • 谈及鼠标事件,就是在触发鼠标按钮后程序所做出相应的反应,但是不影响程序的整个线程。这有些像异步处理。鼠标事件响应不会一直等着我们去按而后续程
  • 这篇文章主要介绍了python实现windows桌面截图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
  • PHP PDO 事务与自动提交现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的。事务支持四大特性(ACID
  • 分布式编程的难点在于:1.服务器之间的通信,主节点如何了解从节点的执行进度,并在从节点之间进行负载均衡和任务调度;2.如何让多个服务器上的进
  • 环境准备好了!我们怎么使用这些东东?IIS用组件初始化是用这个过程Public Sub OnStartPage给个使用asp组件的例子:数字
  • 一、手指触屏,利用touchstart和touchend计算前后滑动距离,判断是上拉还是下滑。二、js中距离:pageY、clientY、o
  • 两个多月来唯一一次有时间哄么么睡觉,我先给他讲了遍《从前有座山》,还是不睡。又给他讲了这个“保安的故事”:小A是名很敬业的保安,负责保护客户
  • centos下安装配置phpmyadmin,我花了二个晚上,郁闷的我不行,配置phpmyadmin简单吧,很简单,我刚工作的时候,就配置过,
  • 1、控制"纵打"、 横打”和“页面的边距。 (1)<script defer> function SetPr
  • 我们在Python中经常使用会用到matplotlib画图,有些曲线和点的形状、颜色信息长时间不用就忘了,整理一下便于查找。安装matplo
  • 案例故事:大部分带彩色屏幕的终端设备,不管是手机,车机,电视等等,都需要涉及图片的显示,作为一名专业的多媒体测试人员,我们需要一堆的规范化标
  • 基础知识-----黄金分割法960px宽度的网格设计的好处无需我多说了,下面主要是复习一下如何作图求出960px宽度下的黄金分割点1、首先沿
  • 1.MTV开发模式介绍M:Models 模型(数据)与数据组织相关的功能。组织和存储数据的方法和模式,与数据模型相关的操作。T:Templa
  • 一、IE透明度问题在IE的高度超过某一阀值时,会产生透明度不时失效的问题,这现象比较奇怪,(会有的时候全黑,有的时候全白)你有可能无法复现。
手机版 网络编程 asp之家 www.aspxhome.com