用Python 把罗小黑养在自己桌面

2024-01-06 05:30
文章标签 python 桌面 小黑 养在

本文主要是介绍用Python 把罗小黑养在自己桌面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  引言:

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

  

  效果图

  01

  系统概述

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

  02

  代码流程讲解

  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("

  ")

  (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=selfwin)

  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()

  (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效果图

这篇关于用Python 把罗小黑养在自己桌面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/575332

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e