背景:因为项目需要,要开发一个在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写一个跟随鼠标运动的自定义窗口相关推荐

  1. 跟随鼠标走的文字的html代码,跟随鼠标走的文字的HTML代码

    跟随鼠标走的文字的HTML代码 跟着鼠标走的文字 visibility:visible; top:-50px; font-size:12pt; font-family:隶书; color: 00001 ...

  2. CSS自定义鼠标样式。JS获取鼠标坐标,实现提示气泡框跟随鼠标移动

    cursor: url(//img.58cdn.com.cn/resource/xxzl/captcha/pencil.png), default; ​​​​​​​ /*获取鼠标位置,让提示气泡框跟随 ...

  3. cesium鼠标控制键盘_用 Python 控制 鼠标和键盘,花式操作

    可能有时候你需要在电脑做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己爱干嘛干嘛去,有点 "按键精灵" 的意思,是不是 ...

  4. python弹球游戏绑定鼠标事件_用python和pygame游戏编程入门-弹球[鼠标控制]

    本节我们再将鼠标的事件引入到这个动画中,要做什么呢?就是在动画中,如果按下鼠标左键,小球会停止移动,如果松开左键,小球会移动到鼠标的位置,然后继续刚才的运动:如果按下鼠标左键不放,移动鼠标,小球就会跟 ...

  5. python飞机大战跟随鼠标移动_用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动...

    # -*- coding: utf8 -*- background_image_filename = 'background.png' mouse_image_filename = 'hero.png ...

  6. python自动轨迹绘制七边形_前端系列——canvas实现按住鼠标移动绘制出轨迹

    概要 工作以来,写过vue.react.正则.算法.小程序等知识,唯独没有写过canvas,因为实在不会啊! 2018年,给自己设定一个小目标:学会canvas,达到的效果是能用canvas实现一些c ...

  7. python怎么做软件程序_看 Python 超级程序员使用什么开发工具

    Python超级程序员使用的开发工具 我以个人的身份采访了几个顶尖的Python程序员,问了他们以下5个简单的问题: 当前你的主要开发任务是什么? 你在项目中使用的电脑是怎样的? 你使用什么IDE开发 ...

  8. python交互式和文件式_使用Python创建和自动化交互式仪表盘

    python交互式和文件式 In this tutorial, I will be creating an automated, interactive dashboard of Texas COVI ...

  9. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

最新文章

  1. 数据库-数据类型及主键外键
  2. Java面向对象编程(基础部分)
  3. 微软公布 Windows Phone 8 多项新特性
  4. 今天英雄联盟服务器维护要到好久,lol今天维护时间是多久 lol维护公告2020最新...
  5. tablediff同步
  6. vscode在windows10系统下进行go语言编程(无法代码提示)
  7. “TI门外汉”网路知识笔记四 单臂路由
  8. python基本数据类型(字节字符十进制十六进制二进制转换)
  9. Python连接DB2数据库
  10. 学习《21天学通java(第7版)》之错误收集
  11. win7录屏_专业电脑录屏方法有哪些?分享录屏靠谱方法!
  12. 如何设计并实施CRM与ERP的整合方案?
  13. windows10 计算机打不开怎么办,win10计算器打不开怎么解决|win10打开计算器的方法...
  14. 数据分析案例2:股票均线策略(双均线策略收益率12.15%)
  15. 《上海市居住证》签注和积分确认流程指南
  16. BIM模型文件下载——江湖别墅Revit模型
  17. 跳转第三方App或网页进行导航
  18. 明星代言的商品一般都不便宜,为何还那么受青睐?
  19. HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!
  20. 人工神经网络的算法原理,神经网络算法的原理是

热门文章

  1. 软件工程学习进度第四周暨暑期学习进度之第四周汇总
  2. Kafka学习之二 Kafka安装和使用
  3. 程序员的圣诞节后-零
  4. [转]Decide.com是怎么做商品价格预测的
  5. (转)一步一步Asp.Net MVC系列_权限管理之权限控制
  6. Transact-SQL命令语法-数据表
  7. 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
  8. 解决dpdk中出现IOMMU not found的问题
  9. C语言基本语法——结构体、联合和枚举
  10. 多行文本溢出显示省略号