作者 | 李秋键

责编 | 寇雪芹

出品 | AI科技大本营(ID:rgznai100)

引言:

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

效果图

系统概述

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

代码流程讲解

2.1 导入库:

在这里我们使用到了用os设置程序QT环境的问题。通过使用下述代码可以实现对环境的设置,这里是为了免环境程序的搭建而使用。如果我们不用可以去除这个代码:

1os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = "Lib\site-packages\PyQt5\Qt\plugins"

然后导入其他所使用到的库:

 1import os2os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = "Lib\site-packages\PyQt5\Qt\plugins"3import sys4from PyQt5.QtGui import *5from PyQt5.QtCore import *6from PyQt5.QtWidgets import *7from PyQt5 import QtWidgets, QtGui8# 导入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 = True5        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 Qt4    '''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=17    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 搭建车道智能检测系统
点分享点收藏点点赞点在看

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

  1. python画罗小黑_Python3+requests库爬取豆瓣《罗小黑战记》评论

    贴一下抓到的评论,最后几条的 本渣是在校学生(非计算机相关),今年上半年接触Python,然后暑假开始学着写爬虫. 新手,本文如有错误,谢谢指正. 这个爬虫开始思路有点乱,现在比较清晰了 思路:req ...

  2. 罗小黑用flash做的_董小姐说电影丨这次都听我的,去看《罗小黑战记》

    董小姐说电影:爱电影的人总会遇到 董文欣:济南百丽宫影城经理.电影资深爱好者 潘娇:FM102.1<体娱潘铎拉>节目主播 潘娇:各位上午好,欢迎来到董小姐说电影,我是主播大娇.有请我们来自 ...

  3. 罗小黑用flash做的_中影星美好看罗小黑战记正式定档!

    <罗小黑战记>定档的消息一发出,原微博已被转发45000+次,大家真是太激动啦~ 罗小黑官博下热闹非凡 在B站也同样壮观 原是猫妖的小黑,在盗取宝珠后逃走,但被发现,而化为了一只猫,在街头 ...

  4. 《从零开始学Python网络爬虫》罗攀 蒋仟 代码

    第1章 Python零基础语法入门 1.3 函数与控制语句 1.3.1 函数 1.3.2 判断语句 1.3.3 循环语句 1.4 Python数据结构 1.4.1 列表 1.4.2 字典 1.4.3 ...

  5. Python运用urllib2和BeautifulSoup爬取网站ZOL桌面壁纸上的精美电脑壁纸

    Python运用urllib2和BeautifulSoup爬取网站ZOL桌面壁纸上的精美电脑壁纸 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  6. python画罗小黑_python股票数据聚类算法:罗小黑战记的股票_XAC配资之家

    python股票数据聚类算法:罗小黑战记的股票 你好朋友,本文将为你分析python股票数据聚类算法怎么样以及罗小黑战记的股票的相关问题,如有任何疑问和留言咨询站长!有了尊严,我们的人生才会快乐.美好 ...

  7. 如何用python画人像_如何用Python画曼德勃罗集

    先上图好看的曼德勃罗集 错了错了是这个特别好看的曼德勃罗集 当然你需要下载Python(https://www.python.org) 和Visual Studio 2019(https://visu ...

  8. 基于Python画曼德勃罗集

    最近有点迷分型几何,看到"上帝指纹"曼德勃罗集,想用Python实现一下. 源码很简单20行不到. import matplotlib.pyplot as plt import n ...

  9. 基于MATLAB和python输出曼德勃罗集

    上帝的指纹--曼德勃罗集 曼德勃罗集可称是人类有史以来做出的最奇异.最瑰丽的几何图形,被人称为"上帝的指纹"."魔鬼的聚合物". 这个点集均出自公式:Zn+1= ...

最新文章

  1. keras简单介绍与使用
  2. scala的多种集合的使用(8)之队列和栈的操作方法
  3. centos下搭建yum服务器
  4. 触发器和java的关系_触发器-1 - java ee spring - 博客园
  5. 深度解析mysql登录原理
  6. JVM_07 Class文件结构
  7. Eclipse下搭建C语言开发环境
  8. android 扫描照片功能,Android自定义View- 雷达扫描图
  9. 【Java学习笔记】线程学习笔记
  10. 如何使用 Microsoft Azure Media Services 现场直播,(Live Streaming) 直播流媒体系统
  11. symbian系统开发教程(一)
  12. 根据/proc/meminfo对空闲内存进行占用
  13. 使用map的find头文件_C++ map的基本操作和使用
  14. web.xml中的contextConfigLocation在spring中的作用
  15. 狐假虎威的故事,狐假虎威的故事告诉我们什么道理?
  16. 6、vueJs基础知识06
  17. Python3中Dict不能在循环中删除元素
  18. 智力与联系能力的关系
  19. 数据库系统概论(第五版) 王珊 第一章课后习题答案
  20. 干货:1分钟了解巨量引擎准入行业和资质规范

热门文章

  1. 阿里云移动数据分析服务使用教程
  2. Go处理百万每分钟的请求
  3. SiteMesh介绍
  4. 比较分析与数组相关的sizeof和strlen
  5. 经典SQL(sqlServer)
  6. Android UI系列-----CheckBox和RadioButton(1)
  7. Java中的多线程总结
  8. 电动助力转向EPS技术详解
  9. C++加快编译速度的方法
  10. 【转】ASP.NET Page事件的执行顺序