ef paintEvent(self, event): # 重置遮罩图像 self.pixmap.fill()

# 创建绘制用的QPainter,笔画粗细为2像素 # 事先已经在Qt窗体上铺了一个蓝色的背景图片,因此投过遮罩图案看下去标记线条是蓝色的 p = QPainter(self.pixmap)

p.setPen(QPen(QBrush(QColor(0, 0, 0)), 2))

for row in xrange(len(self.result)): for col in xrange(len(self.result[0])): if self.result[row][col] != 0: # 定一个基点,避免算数太难看 base_l_x = self.ANCHOR_LEFT_X + self.CLIP_WIDTH * col

base_r_x = self.ANCHOR_RIGHT_X + self.CLIP_WIDTH * col

base_y = self.ANCHOR_Y + self.CLIP_HEIGHT * row

if row == 0 or self.result[row - 1][col] == 0: # 如果是第一行,或者上面的格子为空,画一条上边 p.drawLine(base_l_x, base_y, base_l_x + self.CLIP_WIDTH, base_y)

p.drawLine(base_r_x, base_y, base_r_x + self.CLIP_WIDTH, base_y) if row == len(self.result) - 1 or self.result[row + 1][col] == 0: # 如果是最后一行,或者下面的格子为空,画一条下边 p.drawLine(base_l_x, base_y + self.CLIP_HEIGHT, base_l_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT)

p.drawLine(base_r_x, base_y + self.CLIP_HEIGHT, base_r_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT) if col == 0 or self.result[row][col - 1] == 0: # 如果是第一列,或者左边的格子为空,画一条左边 p.drawLine(base_l_x, base_y, base_l_x, base_y + self.CLIP_HEIGHT)

p.drawLine(base_r_x, base_y, base_r_x, base_y + self.CLIP_HEIGHT) if col == len(self.result[0]) - 1 or self.result[row][col + 1] == 0: # 如果是第一列,或者右边的格子为空,画一条右边 p.drawLine(base_l_x + self.CLIP_WIDTH, base_y, base_l_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT)

p.drawLine(base_r_x + self.CLIP_WIDTH, base_y, base_r_x + self.CLIP_WIDTH, base_y + self.CLIP_HEIGHT)

# 在遮罩上绘制按钮区域,避免按钮被遮罩挡住看不见 p.fillRect(self.btn_compare.geometry(), QBrush(QColor(0, 0, 0)))

p.fillRect(self.btn_toggle.geometry(), QBrush(QColor(0, 0, 0)))

# 将遮罩图像作为遮罩 self.setMask(QBitmap(self.pixmap))

这里我没有替换变量,太麻烦了,能看清楚算法就行。

让PyQt程序在任务栏隐藏

为了让PyQt程序不出现在任务栏,构造QWidget设置了这些属性

self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Popup | Qt.Tool)

让PyQt程序加入系统托盘、资源文件使用PyQt添加托盘菜单非常容易,几行代码就可以

创建托盘 self.icon = QIcon(":\icon.png")

self.trayIcon = QSystemTrayIcon(self) self.trayIcon.setIcon(self.icon) self.trayIcon.setToolTip(u"QQ找茬助手") self.trayIcon.show()

# 托盘气泡消息 self.trayIcon.showMessage(u"QQ找茬助手", u"QQ找茬助手已经待命,进入游戏即可激活")

# 托盘菜单 self.action = QAction(u"退出QQ找茬助手", self, triggered = sys.exit) # 触发点击后调用sys.exit()命令,即退出 self.menu = QMenu(self) self.menu.addAction(self.action) self.trayIcon.setContextMenu(self.menu)

最初我是用的托盘图标是一个.ico文件,执行脚本可以正常显示,但打包成exe后执行在托盘上显示为一个空白图标,用Python的idle工具编译运行也是空白。尝试多次后发现:PyQt的托盘图标不能使用.ico文件,否则会显示空白,换成png格式素材就没问题!

PyQt资源文件打包

Qt使用一个.qrc格式的xml文件管理素材,代码用可用:\xxx\xxx.png的方式引用资源文件中的素材,这在PyQt中同样支持。

这里我创建了一个resources.qrc文件

icon.png

然后用

pyrcc4 resources.qrc > resources.py

命令,将资源文件转成一个python模块,在代码中import resources,则可以用这样的方式使用图像素材

self.icon = QIcon(":\icon.png")

打包成可执行程序

这个工具是给别人用的,肯定不能以py脚本的形式发布,我使用了cx_Freeze来打包为可执行程序。

为此要写一个打包命令脚本convert2exe.py

#!Python #coding=gbk # python转exe脚本 # # 安装cx_Freeze # 执行 python convert2exe.py build # 将自动生成build目录, 其下所有文件都必须打包 # import sys from cx_Freeze import setup, Executable

base = None if sys.platform == "win32":

base = "Win32GUI"

buildOptions = dict(

compressed = True)

setup(

name = "ZhaoChaAssistant", version = "1.0", description = "ZhaoChaAssistant", options = dict(build_exe = buildOptions), executables = [Executable("zhaochaassistant.py", base = base, icon = "icon.ico")])

最后执行一个命令

python convert2exe.py build

则会在当前路径下创建个build目录,打包的程序就在其中一个exe.win-amd64-2.7的目录中,运行exe即可执行,与Python无二。可惜这个包太大了一些,整个目录达到了30M。

为了让exe程序也有一个好看的图标,在最后一行中的executables参数中指定了icon = "icon.ico",这个图标就最好使用多页的.ico格式(16x16,32x32,48x48...),让程序在各种显示环境下(桌面、文件夹)都有原生的显示。

如果打包的时候必须使用独立的资源,可在buildOptions字典参数中增加一条include_files = ['xxx.dat']配置,这样在打包时会将python脚本目录中的xxx.dat文件拷贝到exe目录中,不写的话就得人工拷贝了。

小技巧:Python获得自己的绝对路径

Python中有个魔术变量可以得到脚本自身的名称,但转换成exe后该变量失效,这时得改用sys.executable获得可执行程序的名称,可用hasattr(sys, "frozen")判断自己是否已被打包,下面是一个方便取绝对路径的函数:

import sys def module_path(): if hasattr(sys, "frozen"): return os.path.dirname(os.path.abspath(unicode(sys.executable, sys.getfilesystemencoding()))) return os.path.dirname(os.path.abspath(unicode(__file__, sys.getfilesystemencoding())))

结束语

Python可能是程序员最好的玩具,什么都能粘起来,日常写点小工具再合适不过了。

文中的第三方模块都可以Google获得下载地址,有些库没有Win7 64位的原始版本(比如PIL),但可到

http://www.lfd.uci.edu/~gohlke/pythonlibs/

下载别人编译好的,也很方便。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

立即提交

专题推荐独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

php中文网:公益在线php培训,帮助PHP学习者快速成长!

Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1

python实现图片找不同游戏_用Python实现QQ游戏大家来找茬辅助工具相关推荐

  1. python读取图片文字为表格_利用python将图片转换成excel文档格式

    前言 本文主要介绍了关于利用python将图片转换成excel文档的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实现步骤 读取图像,获取图像每个像素点的RGB值: 根据 ...

  2. python给图片加动态特效_用Python给图片加上抖音效果

    前一篇 Python实现抖音体 给文字加上抖音效果,这一篇我们来用Python给图片加上抖音效果.原理其实是类似的,这里我们详细地讲解一下过程,并且给出代码实现. 准备工作 程序用到Pillow,nu ...

  3. python动态图片转字符画_使用python实现一个将图片转换成字符画的功能

    使用python实现一个将图片转换成字符画的功能 发布时间:2020-11-05 16:01:25 来源:亿速云 阅读:97 使用python实现一个将图片转换成字符画的功能?针对这个问题,这篇文章详 ...

  4. python提取图片文字视频教学_用Python提取视频中的图片

    小编自己码的通用型函数,支持各种常用视频格式,可满足常用需求,亲测效果和速度都不错. 想获取本文数据和完整代码的下载链接,请关注微信公众号"R语言和Python学堂",并回复发文日 ...

  5. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  6. python把图片存放到数据库_使用Python把图片存入数据库

    一般情况下我们是把图片存储在文件系统中,而只在数据库中存储文件路径的,但是有时候也会有特殊的需求:把图片二进制存入数据库. MYSQL是支持把图片存入数据库的,也相应的有一个专门的字段BLOB(Bin ...

  7. python 提取图片的某个颜色_使用python提取图片中的主体颜色

    上次国庆节去谷歌开发者大会,体验了很多有趣的人工智能项目. 其中有一个颜色匹配的环节,叫做"AI调色板,解码缤纷艺术世界",让我觉得很有意思,回来后,我计划自己实现一个类似的功能. ...

  8. python动态图片转字符画_用Python实现图画转换字符画

    | 作者:阿广(中科院在读博士生) | 来源:视学算法 在完成基于Python生成铅笔素描图后,朋友们对其非常感兴趣.不满足于现状,却局限于现状,对静态和动态的图画进行了字符画的转变,何尝不呈现出&q ...

  9. python做图片石头剪刀布获胜法_一个python石头剪刀布送给大家

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import time import random import easygui while True : a=easygui.enterbox(&quo ...

  10. QQ找茬辅助工具的制作

    QQ找茬辅助工具的制作 转载请注明出处:http://www.cppblog.com/greatws/archive/2009/05/05/81996.html 这段时间GF一直在玩QQ找茬,看了一下 ...

最新文章

  1. 开运算和闭运算_OpenCV计算机视觉学习(5)——形态学处理(腐蚀膨胀,开闭运算,礼帽黑帽,边缘检测)...
  2. 改变libreOffice的Calc的背景颜色
  3. 华为p50预装鸿蒙系统,华为P50系列将至,内部测试预装鸿蒙系统,还有4款重磅新品将发布...
  4. LINUX下统计代码行数
  5. python网络爬虫的流程图_基于Python的网络爬虫的设计与实现
  6. java map 对象作为key_Java 将自定义的对象作为HashMap的key
  7. 数据库基础:什么是MySQL?
  8. css3中skew与rotateX(),rotateY()的用法
  9. 软件设计师中级- 数据结构与算法基础
  10. android 动画进度控制,Android仿美团加载数据、小人奔跑进度动画对话框实现方法...
  11. 蓝牙模块 hc06 linux,arduino教程——蓝牙模块hc05和hc06的相互连接
  12. Centos linux 修改ip地址
  13. Java摇骰子比大小_android 摇骰子比大小app源码
  14. 手把手教你运用JAVA爬虫技术爬取小说
  15. 使用Filler4提取微信小程序中的视频
  16. Java 获取姓氏并获取姓氏的笔画数
  17. 关于 iOS 游戏发展趋势的思考
  18. cocos2dx之MoveTo,MoveBy
  19. 数据包络分析--SBM Model(第二篇)
  20. 像程序员一样思考——程序员的四个境界

热门文章

  1. Python数据挖掘——文本分析
  2. 川大计算机学院新生开学典礼,李怡院长2019级新生开学典礼致辞:成为一位有理想有情操有担当的川大人...
  3. toMap函数 java.lang.IllegalStateException: Duplicate key 123 (attempted merging values 123 and 124)
  4. 【Decouple】《Improving Semantic Segmentation via Decoupled Body and Edge Supervision》
  5. python列表姓氏_Python 批量生成中文姓名(百家姓)
  6. 网络营销的方案及技巧
  7. 原型模式,孙悟空都会用,猴毛变出的小猴子!
  8. 做一个模仿Windows画板喷漆笔刷效果
  9. OPPO VIVO 三星 小米破网络锁,改全网通与案例分析
  10. Linux文件-/etc/login.defs