Python 玩出花儿,把罗小黑养在自己桌面

百家 作者:AI100 2021-03-17 22:48:52

作者 | 李秋键
责编 |?寇雪芹
出品?|?AI科技大本营(ID:rgznai100)

引言:
了解过我们之前文章的都知道我们曾经做过一个智能桌宠项目。但是很显然那个程序过于卡段。故这一次我们将重新制作个智能桌宠项目,不同于之前的项目在于,之前使用了大量的jpg图片替换造成了卡顿现象。而这一次我们将不会采用这种方式,具体见下面代码讲解。文末附源码。
效果图

系统概述

首先,我们只做桌宠的目的是为了方便操作电脑,故这一版本将包含搭建免python环境去运行程序。即可以在没有安装python的电脑上运行桌宠程序,但过程有些复杂,只会在文末给出免安装的程序。

代码流程讲解

2.1 导入库:

在这里我们使用到了用os设置程序QT环境的问题。通过使用下述代码可以实现对环境的设置,这里是为了免环境程序的搭建而使用。如果我们不用可以去除这个代码:
1os.environ['QT_QPA_PLATFORM_PLUGIN_PATH']?=?"Lib\site-packages\PyQt5\Qt\plugins"
然后导入其他所使用到的库:
1import?os
2os.environ['QT_QPA_PLATFORM_PLUGIN_PATH']?=?"Lib\site-packages\PyQt5\Qt\plugins"
3import?sys
4from?PyQt5.QtGui?import?*
5from?PyQt5.QtCore?import?*
6from?PyQt5.QtWidgets?import?*
7from?PyQt5?import?QtWidgets,?QtGui
8#?导入QT,其中包含一些常量,例如颜色等
9from?PyQt5.QtCore?import?Qt
10#?导入常用组件
11from?PyQt5.QtWidgets?import?QApplication,?QMainWindow
12from?PyQt5.QtWidgets?import?QLabel
13from?threading?import?Thread
14#?使用调色板等
15from?PyQt5.QtGui?import?QIcon,?QMovie
16import?time
17import?os
18import?random

2.2 设置程序整体的初始化:
程序界面的初始化包括如下内容:
(1)不规则窗口的建立;实现不规则窗口的最简单方式就是图片素材不仅当遮罩层,还当背景图片,通过重载paintEvent()函数绘制窗口背景;?使用函数setMask(self,QBitmap)setMask(self,QRegion)。setMask()的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的部分,使之看起来是透明的,它的参数可以为QBitmap或QRegion对象,此处调用QPixmap的mask()函数获得图片自身的遮罩,是一个QBitmap对象,在实例中使用的是PNG格式的图片,它的透明部分就是一个遮罩
1super(DemoWin,?self).__init__()
2self.initUI()
3#?初始化,不规则窗口
4self.setWindowFlags(Qt.FramelessWindowHint?|?Qt.WindowStaysOnTopHint?|?Qt.SubWindow)
5self.setAutoFillBackground(False)
6self.setAttribute(Qt.WA_TranslucentBackground,?True)
7self.repaint()
(2)鼠标初始化,这里设置鼠标的作用主要是为了能够实现鼠标拖动桌宠的效果。
1#?是否跟随鼠标
2self.is_follow_mouse?=?False
3self.move(1650,20)
(3)语料库的初始化,这里设置语料库在data.txt中。桌宠弹出的对话所搜索的txt内容也可以按照自己的需求修改。
1with?open("data.txt",?"r")?as?f:
2????text?=?f.read()
3????self.sentence?=?text.split("\n")
(4)设置托盘图标。因为考虑到桌宠在不需要的时候方便管理,设置托盘图标可以随时隐藏桌宠和显示桌宠:
1#?设置托盘选项
2iconpath="1.jpg"
(5)设置右键菜单功能的初始化 :
1#右键菜单
2quit_action?=?QAction(u'退出',?self,?triggered=self.quit)
3quit_action.setIcon(QIcon(iconpath))
4showwin?=?QAction(u'显示',?self,?triggered=self.showwin)
5self.tray_icon_menu?=?QMenu(self)
6self.tray_icon_menu.addAction(showwin)
7self.tray_icon_menu.addAction(quit_action)
8self.tray_icon?=?QSystemTrayIcon(self)
9self.tray_icon.setIcon(QIcon(iconpath))
10self.tray_icon.setContextMenu(self.tray_icon_menu)
11self.tray_icon.show()
(6)透明窗口:
1#窗口透明程度
2self.setWindowOpacity(1)
(7)设置对话框,为鼠标长时间停留的对话框:
1#?对话框
2QToolTip.setFont(QFont('楷体',?14))
3y?=?['不要随便摸人家啦',?'每次见到主人都很开心呀',?'话说最近主人都没理我诶',?'再摸我的话小心我生气了',?'恭喜发财大吉大利']
4self.setToolTip(random.choice(y))
5#?每隔一段时间做个动作
6self.timer?=?QTimer()
7self.timer.timeout.connect(self.randomAct)
8self.timer.start(7000)
9self.condition?=?0
10self.talk_condition=0
(8)设置桌宠具有随机动作:
1#?每隔一段时间做个动作
2self.timer1?=?QTimer()
3self.timer1.timeout.connect(self.talk)
4self.timer1.start(5000)
5self.pet1?=?[]
6for?i?in?os.listdir("biu"):
7????self.pet1.append("biu/"?+?i)


2.3 设置GUI界面的初始化:

内容包括窗口大小位置标题等定义,具体见如下代码,都有做注解:
1def?initUI(self):
2????#?将窗口设置为动图大小
3????self.resize(400,?400)
4????self.label1?=?QLabel("",?self)
5????self.label1.setStyleSheet("font:15pt?'楷体';border-width:?1px;color:blue;")??#?设置边框
6????#?使用label来显示动画
7????self.label?=?QLabel("",?self)
8????#?label大小设置为动画大小
9????self.label.setFixedSize(200,?200)
10????#?设置动画路径
11????self.movie?=?QMovie("./biu/biu12.gif")
12????#宠物大小
13????self.movie.setScaledSize(QSize(200,?200))
14????#?将动画添加到label中
15????self.label.setMovie(self.movie)
16????#?开始播放动画
17????self.movie.start()
18????#透明窗口
19????#self.setWindowOpacity(1)
20????#?添加窗口标题
21????self.setWindowTitle("GIFDemo")

2.4?设置鼠标拖动功能:
鼠标拖动功能其实就是鼠标和窗口的绑定和移动解绑。即鼠标左键按下时, 宠物将和鼠标位置绑定;然后鼠标移动, 则宠物也移动;接着鼠标释放时, 取消绑定。代码如下:
1'''鼠标左键按下时,?宠物将和鼠标位置绑定'''
2def?mousePressEvent(self,?event):
3????if?event.button()?==?Qt.LeftButton:
4????????self.is_follow_mouse?=?True
5????????self.mouse_drag_pos?=?event.globalPos()?-?self.pos()
6????????event.accept()
7????????self.setCursor(QCursor(Qt.OpenHandCursor))
8????????self.movie?=?QMovie("./biu/biu10.gif")
9????????#?宠物大小
10????????self.movie.setScaledSize(QSize(200,?200))
11????????#?将动画添加到label中
12????????self.label.setMovie(self.movie)
13????????#?开始播放动画
14????????self.movie.start()
15'''鼠标移动,?则宠物也移动'''
16def?mouseMoveEvent(self,?event):
17????if?Qt.LeftButton?and?self.is_follow_mouse:
18????????self.move(event.globalPos()?-?self.mouse_drag_pos)
19????????event.accept()
20'''鼠标释放时,?取消绑定'''
21def?mouseReleaseEvent(self,?event):
22????self.is_follow_mouse?=?False
23????self.setCursor(QCursor(Qt.ArrowCursor))

2.5 设置鼠标移入时变换:

设置鼠标碰到桌宠时变成小手的状态,这样更卡通化,显得更亲近:
1def?enterEvent(self,?event):??#?鼠标移进时调用
2????#print('鼠标移入')
3????self.setCursor(Qt.ClosedHandCursor)??#?设置鼠标形状。需要from PyQt5.QtGui import QCursor,from PyQt5.QtCore import Qt
4????'''
5????Qt.PointingHandCursor???指向手????????????Qt.WaitCursor??旋转的圆圈
6????ArrowCursor???正常箭头?????????????????Qt.ForbiddenCursor?红色禁止圈
7????Qt.BusyCursor??????箭头+旋转的圈??????Qt.WhatsThisCursor???箭头+问号
8????Qt.CrossCursor??????十字??????????????Qt.SizeAllCursor????箭头十字
9????Qt.UpArrowCursor?向上的箭头????????????Qt.SizeBDiagCursor??斜向上双箭头
10????Qt.IBeamCursor???I形状?????????????????Qt.SizeFDiagCursor??斜向下双箭头
11????Qt.SizeHorCursor??水平双向箭头??????????Qt.SizeVerCursor??竖直双向箭头
12????Qt.SplitHCursor????????????????????????Qt.SplitVCursor??
13????Qt.ClosedHandCursor???非指向手??????????Qt.OpenHandCursor??展开手
14????'''

15????#?self.unsetCursor()???#取消设置的鼠标形状

2.6 设置鼠标右键菜单:

这里设置的右键菜单有的功能需要按照自己的电脑路径等进行自行修改:
1#?当按右键的时候,这个event会被触发
2def?contextMenuEvent(self,?event):
3????menu?=?QMenu(self)
4????code?=?menu.addAction("代码")
5????py?=?menu.addAction("python—test")
6????hide?=?menu.addAction("隐藏")
7????quitAction?=?menu.addAction("退出")
8????action?=?menu.exec_(self.mapToGlobal(event.pos()))
9????if?action?==?quitAction:
10????????qApp.quit()
11????if?action?==?hide:
12????????self.setWindowOpacity(0)
13????if?action?==?py:
14????????os.startfile("python练习.bat")
15????if?action?==?code:
16????????os.startfile("代码.bat")
17'''退出程序'''
18def?quit(self):
19????self.close()
20????sys.exit()
21'''显示'''
22def?showwin(self):
23????self.setWindowOpacity(1)

2.7 设置宠物状态的改变:

我们需要在我们点击桌宠时,桌宠就会对我们微笑。这样才具有人机交互性能。同时交互和随机状态还不能出现冲突。具体如下:
1'''随机做一个动作'''
2def?randomAct(self):
3????if?not?self.condition:
4????????print("状态变更")
5????????print(random.choice(self.pet1))
6????????self.movie?=?QMovie(random.choice(self.pet1))
7????????#?宠物大小
8????????self.movie.setScaledSize(QSize(200,?200))
9????????#?将动画添加到label中
10????????self.label.setMovie(self.movie)
11????????#?开始播放动画
12????????self.movie.start()
13????????self.condition=1
14????else:
15????????print("状态还原")
16????????#?设置动画路径
17????????self.movie?=?QMovie("./biu/biu12.gif")
18????????#?宠物大小
19????????self.movie.setScaledSize(QSize(200,?200))
20????????#?将动画添加到label中
21????????self.label.setMovie(self.movie)
22????????#?开始播放动画
23????????self.movie.start()
24????????self.condition=0

2.8 设置宠物对话窗口:

通过设置标签的方式作为对话窗口即可:
1def?talk(self):
2????if?not?self.talk_condition:
3????????self.label1.setText(random.choice(self.sentence))
4????????self.label1.setStyleSheet("font:?bold;font:15pt?'楷体';color:yellow;background-color:?black")??#?设置边框
5????????self.label1.adjustSize()
6????????self.talk_condition=1
7????else:
8????????self.label1.setText("")
9????????self.label1.adjustSize()
10????????self.talk_condition?=?0
图2 ?gif效果图

?源码
完整代码下载链接参考CODE?CHINA地址:
https://codechina.csdn.net/qq_42279468/python_pet2_liqiujian

版权声明:本文为CSDN博主「jia666666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
https://blog.csdn.net/jia666666/article/details/81874586
作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

直播间地址:
https://live.csdn.net/room/csdnnews/B3423dYF
更多精彩推荐

?315 曝光人脸识别摄像头,进店瞬间偷走你的“脸”,自动分析心情

?玩转3D全息图像!AI即刻生成

?用 Python 动态可视化,看看比特币这几年

?Python 搭建车道智能检测系统

点分享
点收藏
点点赞
点在看

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接