Python 玩出花儿,把罗小黑养在自己桌面
作者 | 李秋键
责编 | 寇雪芹
出品 | 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 搭建车道智能检测系统
点分享点收藏点点赞点在看
相关文章:

Google推荐的15条HTML 5代码军规----来看看你知道几个,我一个都不知道。。。
Google规范的原文链接大家可以访问:http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml 1.协议头: 建议在指向图片或其他媒体文件、样式表和脚本的URL地址中省略http:https:协议部分,除非已知相应文件不能…

OTS parsing error: invalid version tag woff和ttf文件被Filter拦截
从服务器下载的字体文件放在本地,执行无法展示iconfont,浏览器控制台报出 Failed to decode downloaded font: http://127.0.0.1:8080/mhr/group-assets/iconfont/iconfont.ttf?t1500884389272login_group.html:1 OTS parsing error: invalid version t…

asp.net 的性能计数器
ASP.NET 支持两组性能计数器:系统和应用程序。前者在 ASP.NET 性能计数器对象中的 PerfMon 中公开;后者在 ASP.NET Applications 性能对象中公开。ASP.NET 性能对象中的 State Server Sessions 计数器(仅适用于在其中运行状态服务器的服务器计…

为什么那么多程序员不敢学Python?
Python入门从哪开始?90%以上的书上都是这样讲的:先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构,然后再介绍字符串处理和正则表达式,介绍文件等IO操作.... 就这样一点一点往下说。然而这种按部就班的学习方法&#…
5 配置邮箱服务器
配置邮箱服务器 一邮箱服务器角色 当Exchange邮件服务器使用一段时间后可能面临以下几个问题:邮箱服务器的磁盘空间出现不足、如何将数据库文件移到新的硬盘上、如何共享一些文件给指定的人;为了解决这些问题,我们就要了解邮箱服务器中的邮件…

mongodb 连接和备份
2019独角兽企业重金招聘Python工程师标准>>> 1.查询某一列的值: db.collection_name.find({},{key:1,key1:0}) 第一个 {} 放 where 条件,为空表示返回集合中所有文档 第二个 {} 指定那些列显示和不显示 (0表示不显示 1表示显示[非0都是显示])…

HTTP和SOAP完全就是两个不同的协议
HTTP只负责把数据传送过去,不会管这个数据是XML、HTML、图片、文本文件或者别的什么。而SOAP协议则定义了怎么把一个对象变成XML文本,在远程如何调用等,怎么能够混为一谈。 这样说两种协议: HTTP就是邮局的协议,他…

对网络骚扰和霸凌说不!神经网络可以做得更好
导语:无论在论坛、评论区还是游戏聊天界面,网络骚扰和网络霸凌都是一件让人烦恼的事。怎样避免这些烦人的问题?也许本文介绍的神经网络模型,可以对于使用AI技术手段解决这些问题有所启示。译者 | Rachel头图 | 下载于东方 IC出品 …

主机入侵防御系统(HIPS)分析
主机入侵防御系统(Host Intrusion Prevent System,HIPS)是近几年出现并迅速发展的新兴产物,与传统意义的防火墙和杀毒软件不同,它并不具备特征码扫描和主动杀毒等功能,所以想用它来替换传统杀毒软件然后安枕…

Centos 7 让docker飞一会儿
为什么80%的码农都做不了架构师?>>> 安装shadowsocks yum install -y epel-release python-pip pip install shadowsocks vim /etc/shadowsocks.json {"server": "your.vpn.com","server_port": 8388,"password&quo…

.net应用程序如何批上XP的外衣?
.net framework 所提供的开发控件也太少了,也太难看了,自已画又费时费力也不见得会得出个什么好的效果。如果能够上我们的程序运行在XP环境中能自动应用XP的主题样式那就省时多了,让MICROSOFT给我们去画控件!以下是我所所试验过的解决办法: …

AppCan 学习
2019独角兽企业重金招聘Python工程师标准>>> AppCan 学习 AppCan是以web前端开发方式来开发移动app的解决方案。下面是一些记录: 1.注意 uexWindow.open和uexWindow.openPopover的不同,后者是pop,pop里不能在打开window了。 2.…

在 5G 速度上,iPhone 12 只是个弟弟
作者 | 郑丽媛头图 | 下载自东方 IC出品 | CSDN(ID:CSDNnews)如果不考虑价格因素,让你选择一部手机,你是选 iPhone 还是安卓手机?目前,移动操作系统市场被 iOS 和安卓系统瓜分,体现在…

hadoop install start-dfs.sh 失败
linux:ubuntu 16.04 LTS hadoop version: 2.7.3 JDK: java-9-open-jdk issue: start-dfs.sh start-dfs.sh:command not found 在hadoop sbin目录下可以找到这个文件。但是run不起来。 解决方法: 1. 打开 $HOME/.bashrc 加入下面一行。 PATH$PATH:/usr/l…

用.net中的socket实现文件传输
socket是网络套接字,使用它我们可以很方便的实现网络的数据传输。在.net中提供了socket类来帮助开 发者调用socket的使用,从而避免了调用socket的动态库来实现socket的麻烦。下面我们就来看一个简单的例子,从这个简单的例子来看看.net中的so…

ARP协议学习
Dolphin,ChinaBJ,20131122本文档是检验自己学习TCP/IP协议卷1:协议中关于ARP协议的学习情况。本文档包含以下四部分:1、简述ARP协议;2、ARP的分组格式;3、ARP Spoofing 实验 4、应用及防御方法。1.简述ARP协…

数学,对人工智能开发者意味着什么
21世纪以来,全球化的加速和互联网的蓬勃发展,带来全球范围内电子数据的爆炸性增长,人类迈入了大数据时代。与此同时,计算机芯片的计算能力也持续高速增长。在数据和计算能力指数式增长的支持下,人工智能算法在应用中取…

检查网站是否可以正常访问
# -*- coding: utf-8 -*-import urllib.request import time opener urllib.request.build_opener() opener.addheaders [(User-agent, Mozilla/49.0.2)] #文件格式http://www.baidu.comfile open(E:/auto/url.txt) lines file.readlines() aa[] for line in lines: templ…

使用.NET自带的类实现DataGrid报表的打印。
using System;using System.Windows.Forms;using System.Drawing;using System.Drawing.Printing;using System.Data;using System.Collections;using DataLibrary; namespace ControlLibrary{ /// <summary> /// DataGrid打印 /// </summary> public class DataG…

各种 AI 数据增强方法,都在这儿了
来源 | 算法进阶责编 | 寇雪芹头图 | 下载于视觉中国数据、算法、算力是人工智能发展的三要素。数据决定了Ai模型学习的上限,数据规模越大、质量越高,模型就能够拥有更好的泛化能力。然而在实际工程中,经常有数据量太少(相对模型而言)、样本不…

ORACLE11g 前期安装环境配置
Linux系统可以拿来直接用的脚本哦#!/bin/bashservice iptables stop &> /dev/nulliptables -F service iptables save &> /dev/nullsed -i s/enforcing/disabled/ /etc/selinux/configsetenforce 0sed /tmpfs/d /etc/fstab &> /dev/nullecho tmpfs …

linux mysql 卸载,安装,測试全过程
Mysql卸载yum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有mysql软件:rpm -qa|grep mysql有的话继续删除Mysql安装1>若本地没有安装包 能够考虑使用yum命令进行下载# yum -y install mysql-server# yum…

C#中获取程序当前路径的集中方法
string str1 Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名。 string str2Environment.CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。//备注 按照定义,如果该进程在本…

如何开启远程(win7win8)
如何开启远程连接点击我的电脑-属性-高级系统设置-远程-选中“允许远程连接到此计算机”-应用-确定。在局域网内,拥有固定IP的话,就很容易远程处理事情了。若经过此步骤还不能远程的话,则需要查看系统是否开启了远程服务。“我的电脑”--管理…

微软推出“ Group Transcribe”应用,多人多语言会议实时高准确度文字转录并翻译
近期,微软针对面对面对话和会议推出了免费实时语音到文字转录和翻译应用程序——Group Transcribe。一方面,Group Transcribe可以通过手机把会议的语音内容实时转录为文本,供与会者阅读和浏览。 另一方面,在实时交流过程中&#x…

STM32单片机外部中断配置讲解
2019独角兽企业重金招聘Python工程师标准>>> 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。51单片机有5个中断源,其中有两个是外部中断…

Android语音信号波形显示
简单地介绍了AudioRecord和AudioTrack的使用,这次就结合SurfaceView实现一个Android版的手机模拟信号示波器(PS:以前也讲过J2ME版的手机示波器)。最近物联网炒得很火,作为手机软件开发者,如何在不修改手机硬件电路的前提下实现与第…

科研费4年翻3倍,全球科研队伍突破8000人,滴滴致力打造出行领域核心技术
日前,十三届全国人大四次会议表决通过了《国民经济和社会发展第十四个五年规划和2035年远景目标纲要》(下称《规划》)。《规划》强调要坚持创新在我国现代化建设全局中的核心地位,把科技自立自强作为国家发展的战略支撑。 《规划…

c++ 继承访问控制初步
访问控制方式这里有篇很好的文章,其实内容也是总结cprimer上的内容 现在就按照这篇的文章举例进行学习. 思路 不同继承方式的影响主要体现在: 1、派生类成员对基类成员的访问控制。 2、派生类对象对基类成员的访问控制 三种继承方式 公有继承(public) 所有public和p…