python物体跟着鼠标走_用Python写一个跟随鼠标运动的自定义窗口
背景:因为项目需要,要开发一个在PC上运行的应用程序,生成一个跟随鼠标运动的窗口,并且监听鼠标的点击事件,并在窗口上做相应的显示。
平台:Win7 64位 + Python27 64位
支持库:PyHook + PyQt5
模块的安装这里就不多说了,网上有很多。需要注意的是,PyHook对Python3的支持不是很好,会出现卡死的问题, 还有PyQt5貌似只支持64位。废话不多说了,开始造~
第一步:
先用PyQt5生成一个自定义的窗口:
1 #!usr/bin/env python
2 #-*- coding:utf-8 -*-
3
4 importsys5 from PyQt5.QtCore import *
6 from PyQt5.QtGui import *
7 from PyQt5.QtWidgets import *
8
9 classnewWindow(QWidget):10 def __init__(self, parent=None):11 super(newWindow, self).__init__(parent)12 self.mypix()13 self.setWindowFlags(Qt.FramelessWindowHint) #去除界面边框
14 self.setWindowFlags(Qt.WindowStaysOnTopHint)#窗口显示在屏幕最上方
15 self.setAttribute(Qt.WA_TranslucentBackground)#背景透明
16
17 #显示不规则图片
18 defmypix(self):19 self.update()20 self.pix=QPixmap('./1.png','0',Qt.AvoidDither|Qt.ThresholdAlphaDither|Qt.ThresholdDither)21 self.resize(self.pix.size())22 self.setMask(self.pix.mask())23
24 defpaintEvent(self, QPaintEvent):25 painter=QPainter(self)26 painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),self.pix)27
28 if __name__=="__main__":29 app =QApplication(sys.argv)30
31 w =newWindow()32 w.setWindowTitle('一个窗口')33 w.show()34
35 sys.exit(app.exec_())
显示效果如下:
窗口出来了,下一步救赎让它跟随着鼠标进行移动了
第二步 监听鼠标事件
1 #!usr/bin/env python
2 #-*- coding:utf-8 -*-
3
4 importpyHook5 importpythoncom6
7 classMouseListener():8
9 def __init__(self):10
11 #新建钩子管理器
12 hookmanager =pyHook.HookManager()13 #注册动作回调函数
14 hookmanager.MouseLeftDown =self.onMouseLeftDown15 hookmanager.MouseLeftUp =self.onMouseRelease16 hookmanager.MouseMiddleDown =self.onMouseMiddleDown17 hookmanager.MouseMiddleUp =self.onMouseRelease18 hookmanager.MouseRightDown =self.onMouseRightDown19 hookmanager.MouseRightUp =self.onMouseRelease20 hookmanager.MouseMove =self.onMouseMove21 #钩取鼠标事件
22 hookmanager.HookMouse()23 #推送window事件消息
24 pythoncom.PumpMessages()25
26
27
28 defonMouseLeftDown(self, event):29 print("MouseLeft Down!")30
31 returnTrue32
33 defonMouseMiddleDown(self, event):34 print("MouseMiddle Down!")35
36 returnTrue37
38 defonMouseRightDown(self, event):39 print("MouseRight Down!")40
41 returnTrue42
43 defonMouseRelease(self, event):44 print("Button release!")45
46 returnTrue47
48 defonMouseMove(self, event):49 print("Mouse Move!")50
51 returnTrue52
53
54 if __name__=="__main__":55 mouseListener = MouseListener()
结果如下:
现在最后的问题就是如何结合这两个程序了。
因为Qt界面本身是一个死循环,而监听器里的pythoncom.PumpMessage()也是一个死循环。很自然的想法就是开启多线程。
开启多线程会出现两个问题: 1、因为是死循环,关闭窗口之后,子线程还是在运行,无法关闭。正常手段无法关闭,只能强制关闭,
但是还是会出现问题。
2、可能是两个死循环有影响的原因,当鼠标移动到窗口的时候会卡死。
感兴趣的可以试试,代码就不贴了,下面的写解决办法。
绞尽脑汁,头发都掉了一斤还是解决不了!无意中发现去掉pythoncom.PumpMessages()这个语句,程序居然可以运行。哈哈,天不绝我!!!^-^
1 #!usr/bin/env python
2 #-*- coding:utf-8 -*-
3
4 importpyHook5 importpythoncom6
7 importsys8 from PyQt5.QtCore import *
9 from PyQt5.QtGui import *
10 from PyQt5.QtWidgets import *
11
12
13 classnewWindow(QWidget):14 def __init__(self, parent=None):15 super(newWindow, self).__init__(parent)16 self.mypix()17 self.setWindowFlags(Qt.FramelessWindowHint) #去除界面边框
18 self.setWindowFlags(Qt.WindowStaysOnTopHint)#窗口显示在屏幕最上方
19 self.setAttribute(Qt.WA_TranslucentBackground)#背景透明
20 #新建钩子管理器
21 self.hookmanager =pyHook.HookManager()22 self.hookmanager.MouseMove =self.onMouseMove23 #钩取鼠标事件
24 self.hookmanager.HookMouse()25
26 #显示不规则图片
27 defmypix(self):28 self.update()29 self.pix=QPixmap('./1.png','0',Qt.AvoidDither|Qt.ThresholdAlphaDither|Qt.ThresholdDither)30 self.resize(self.pix.size())31 self.setMask(self.pix.mask())32
33 defpaintEvent(self, QPaintEvent):34 painter=QPainter(self)35 painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),self.pix)36
37
38 defcloseEvent(self, QEvent):39 self.hookmanager.UnhookMouse()40 sys.exit()41
42 defonMouseMove(self, event):43 #print("Mouse Move!")
44 (x, y) =event.Position45 self.move(x, y)46 returnTrue47
48
49 if __name__=="__main__":50 app =QApplication(sys.argv)51
52 w =newWindow()53 w.setWindowTitle('一个窗口')54 w.show()55
56 sys.exit(app.exec_())
OK,问题解决了,解释这么简单!(PS: 我的IDLE运行,关闭时会出现Runtime Error! 直接用命令行运行就不会出现这个问题了)
总结:猜测可能是Qt界面本身就是有类似于pythoncom.PumpMessages()这样功能的语句,所以前面会出现鼠标移动到界面上就出现卡死的现象。
主要还是对底层不太了解,折腾了许久。
python物体跟着鼠标走_用Python写一个跟随鼠标运动的自定义窗口相关推荐
- 跟随鼠标走的文字的html代码,跟随鼠标走的文字的HTML代码
跟随鼠标走的文字的HTML代码 跟着鼠标走的文字 visibility:visible; top:-50px; font-size:12pt; font-family:隶书; color: 00001 ...
- CSS自定义鼠标样式。JS获取鼠标坐标,实现提示气泡框跟随鼠标移动
cursor: url(//img.58cdn.com.cn/resource/xxzl/captcha/pencil.png), default; /*获取鼠标位置,让提示气泡框跟随 ...
- cesium鼠标控制键盘_用 Python 控制 鼠标和键盘,花式操作
可能有时候你需要在电脑做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己爱干嘛干嘛去,有点 "按键精灵" 的意思,是不是 ...
- python弹球游戏绑定鼠标事件_用python和pygame游戏编程入门-弹球[鼠标控制]
本节我们再将鼠标的事件引入到这个动画中,要做什么呢?就是在动画中,如果按下鼠标左键,小球会停止移动,如果松开左键,小球会移动到鼠标的位置,然后继续刚才的运动:如果按下鼠标左键不放,移动鼠标,小球就会跟 ...
- python飞机大战跟随鼠标移动_用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动...
# -*- coding: utf8 -*- background_image_filename = 'background.png' mouse_image_filename = 'hero.png ...
- python自动轨迹绘制七边形_前端系列——canvas实现按住鼠标移动绘制出轨迹
概要 工作以来,写过vue.react.正则.算法.小程序等知识,唯独没有写过canvas,因为实在不会啊! 2018年,给自己设定一个小目标:学会canvas,达到的效果是能用canvas实现一些c ...
- python怎么做软件程序_看 Python 超级程序员使用什么开发工具
Python超级程序员使用的开发工具 我以个人的身份采访了几个顶尖的Python程序员,问了他们以下5个简单的问题: 当前你的主要开发任务是什么? 你在项目中使用的电脑是怎样的? 你使用什么IDE开发 ...
- python交互式和文件式_使用Python创建和自动化交互式仪表盘
python交互式和文件式 In this tutorial, I will be creating an automated, interactive dashboard of Texas COVI ...
- python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...
2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...
最新文章
- 数据库-数据类型及主键外键
- Java面向对象编程(基础部分)
- 微软公布 Windows Phone 8 多项新特性
- 今天英雄联盟服务器维护要到好久,lol今天维护时间是多久 lol维护公告2020最新...
- tablediff同步
- vscode在windows10系统下进行go语言编程(无法代码提示)
- “TI门外汉”网路知识笔记四 单臂路由
- python基本数据类型(字节字符十进制十六进制二进制转换)
- Python连接DB2数据库
- 学习《21天学通java(第7版)》之错误收集
- win7录屏_专业电脑录屏方法有哪些?分享录屏靠谱方法!
- 如何设计并实施CRM与ERP的整合方案?
- windows10 计算机打不开怎么办,win10计算器打不开怎么解决|win10打开计算器的方法...
- 数据分析案例2:股票均线策略(双均线策略收益率12.15%)
- 《上海市居住证》签注和积分确认流程指南
- BIM模型文件下载——江湖别墅Revit模型
- 跳转第三方App或网页进行导航
- 明星代言的商品一般都不便宜,为何还那么受青睐?
- HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
- 人工神经网络的算法原理,神经网络算法的原理是