Python实现桌面悬浮窗(显示网速,内存,CPU)

您所在的位置:网站首页 悬浮球怎么用的 Python实现桌面悬浮窗(显示网速,内存,CPU)

Python实现桌面悬浮窗(显示网速,内存,CPU)

2024-03-16 15:13| 来源: 网络整理| 查看: 265

Python实现桌面悬浮窗(显示网速,内存,CPU) 背景介绍编程环境UI窗口设计设置窗口透明与边框重写鼠标事件,以拖动窗口 实现贴边收起获取网速,内存,CPU信息建立QThread线程,更新网速等信息运行效果打包EXE总结源码链接

背景介绍

习惯了自己的电脑上火绒网速监测小工具,自己写一个,就可以在其他没装火绒的电脑上用啦。 实现的功能: 1.显示网速,CPU,内存占用; 2.贴边收起; 3.改变颜色,右键退出菜单;

编程环境

python3.9 (第三方库 pyside2 pyqt5 psutil) 本来计划使用pyside2的,但资料有点儿少,中途改到pyqt5了,不过两个库基本是兼容的

UI窗口设计 使用pyside2库下的qtdesigner大致画出窗口

在这里插入图片描述 2. 将ui生成py文件便于后续修改: pyside2-uic.exe monitor.ui > monitor_ui.py

设置窗口透明与边框 # 设置窗口无边框; 设置窗口置顶; self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool) # 设置窗口背景透明 # self.setAttribute(Qt.WA_TranslucentBackground) # 设置透明度(0~1) self.setWindowOpacity(0.9) # 设置鼠标为手状 self.setCursor(Qt.PointingHandCursor) 重写鼠标事件,以拖动窗口

由于设置了无边框,窗口无法拖动,需要重写鼠标响应事件,让鼠标按下移动时,窗口跟随鼠标移动;此外,在mouseMoveEvent中加入了限制窗口不能移出主屏幕的代码;

#鼠标按下时,记录鼠标相对窗口的位置 def mousePressEvent(self, event: QMouseEvent): if event.button() == Qt.LeftButton: # event.pos() 鼠标相对窗口的位置 # event.globalPos() 鼠标在屏幕的绝对位置 self._startPos = event.pos() # 鼠标移动时,移动窗口跟上鼠标;同时限制窗口位置,不能移除主屏幕 def mouseMoveEvent(self, event: QMouseEvent): # event.pos()减去最初相对窗口位置,获得移动距离(x,y) self._wmGap = event.pos() - self._startPos # 移动窗口,保持鼠标与窗口的相对位置不变 # 检查是否移除了当前主屏幕 # 左方界限 final_pos = self.pos() + self._wmGap if self.frameGeometry().topLeft().x() + self._wmGap.x() = self.screen_height: final_pos.setY(self.screen_height - self.window_height) self.move(final_pos) def mouseReleaseEvent(self, event: QMouseEvent): if event.button() == Qt.LeftButton: self._startPos = None self._wmGap = None if event.button() == Qt.RightButton: self._startPos = None self._wmGap = None

此处参考:python百行代码自制电脑端网速悬浮窗

实现贴边收起

实现贴边收起需要重写两个鼠标响应函数,enterEvent与leaveEvent;当鼠标进入窗口时,判断是否需要将隐藏的窗口显示;当鼠标离开窗口时,判断是否需要将窗口隐藏;贴边效果借助QT的QPropertyAnimation实现;

当多屏幕时,为了不让窗口移动到另一个屏幕,贴边收起的效果做了相应调整;

def enterEvent(self, event): self.hide_or_show('show', event) def leaveEvent(self, event): self.hide_or_show('hide', event) def hide_or_show(self, mode, event): # 获取窗口左上角x,y pos = self.frameGeometry().topLeft() if mode == 'show' and self.hidden: # 窗口左上角x + 窗口宽度 大于屏幕宽度,从右侧滑出 if pos.x() + self.window_width >= self.screen_width: # 需要留10在里边,否则边界跳动 self.startAnimation(self.screen_width - self.window_width, pos.y()) event.accept() self.hidden = False # 窗口左上角x 小于0, 从左侧滑出 elif pos.x()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3