Python制作智能桌宠2

Python制作新一款智能桌宠

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

图1 效果图

1、系统概述

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

2、代码流程讲解

2.1导入库:

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

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

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

import os
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = "Lib\site-packages\PyQt5\Qt\plugins"
import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets, QtGui
# 导入QT,其中包含一些常量,例如颜色等
from PyQt5.QtCore import Qt
# 导入常用组件
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QLabel
from threading import Thread
# 使用调色板等
from PyQt5.QtGui import QIcon, QMovie
import time
import os
import random

2.2设置程序整体的初始化:

程序界面的初始化包括如下内容:
(1)不规则窗口的建立;实现不规则窗口的最简单方式就是图片素材不仅当遮罩层,还当背景图片,通过重载paintEvent()函数绘制窗口背景; 使用函数setMask(self,QBitmap)setMask(self,QRegion)。setMask()的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的部分,使之看起来是透明的,它的参数可以为QBitmap或QRegion对象,此处调用QPixmap的mask()函数获得图片自身的遮罩,是一个QBitmap对象,在实例中使用的是PNG格式的图片,它的透明部分就是一个遮罩

super(DemoWin, self).__init__()
self.initUI()
# 初始化,不规则窗口
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
self.setAutoFillBackground(False)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.repaint()

(2)鼠标初始化,这里设置鼠标的作用主要是为了能够实现鼠标拖动桌宠的效果。

# 是否跟随鼠标
self.is_follow_mouse = False
self.move(1650,20)

(3)语料库的初始化,这里设置语料库在data.txt中。桌宠弹出的对话所搜索的txt内容也可以按照自己的需求修改。

with open("data.txt", "r") as f:
    text = f.read()
    self.sentence = text.split("\n")

(4)设置托盘图标。因为考虑到桌宠在不需要的时候方便管理,设置托盘图标可以随时隐藏桌宠和显示桌宠;

# 设置托盘选项
iconpath="1.jpg"

(5)设置右键菜单功能的初始化

#右键菜单
quit_action = QAction(u'退出', self, triggered=self.quit)
quit_action.setIcon(QIcon(iconpath))
showwin = QAction(u'显示', self, triggered=self.showwin)
self.tray_icon_menu = QMenu(self)
self.tray_icon_menu.addAction(showwin)
self.tray_icon_menu.addAction(quit_action)
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon(iconpath))
self.tray_icon.setContextMenu(self.tray_icon_menu)
self.tray_icon.show()

(6)透明窗口:

#窗口透明程度
self.setWindowOpacity(1)

(7)设置对话框,为鼠标长时间停留的对话框:

# 对话框
QToolTip.setFont(QFont('楷体', 14))
y = ['不要随便摸人家啦', '每次见到主人都很开心呀', '话说最近主人都没理我诶', '再摸我的话小心我生气了', '恭喜发财大吉大利']
self.setToolTip(random.choice(y))
# 每隔一段时间做个动作
self.timer = QTimer()
self.timer.timeout.connect(self.randomAct)
self.timer.start(7000)
self.condition = 0
self.talk_condition=0
(8)设置桌宠具有随机动作:
# 每隔一段时间做个动作
self.timer1 = QTimer()
self.timer1.timeout.connect(self.talk)
self.timer1.start(5000)
self.pet1 = []
for i in os.listdir("biu"):
    self.pet1.append("biu/" + i)

2.2设置GUI界面的初始化:

内容包括窗口大小位置标题等定义,具体见如下代码,都有做注解:

def initUI(self):
    # 将窗口设置为动图大小
    self.resize(400, 400)
    self.label1 = QLabel("", self)
    self.label1.setStyleSheet("font:15pt '楷体';border-width: 1px;color:blue;")  # 设置边框
    # 使用label来显示动画
    self.label = QLabel("", self)
    # label大小设置为动画大小
    self.label.setFixedSize(200, 200)
    # 设置动画路径
    self.movie = QMovie("./biu/biu12.gif")
    #宠物大小
    self.movie.setScaledSize(QSize(200, 200))
    # 将动画添加到label中
    self.label.setMovie(self.movie)
    # 开始播放动画
    self.movie.start()
    #透明窗口
    #self.setWindowOpacity(1)
    # 添加窗口标题
    self.setWindowTitle("GIFDemo")

2.3设置鼠标拖动功能:

鼠标拖动功能其实就是鼠标和窗口的绑定和移动解绑。即鼠标左键按下时, 宠物将和鼠标位置绑定;然后鼠标移动, 则宠物也移动;接着鼠标释放时, 取消绑定。代码如下:
‘’‘鼠标左键按下时, 宠物将和鼠标位置绑定’’’

def mousePressEvent(self, event):
    if event.button() == Qt.LeftButton:
        self.is_follow_mouse = True
        self.mouse_drag_pos = event.globalPos() - self.pos()
        event.accept()
        self.setCursor(QCursor(Qt.OpenHandCursor))
        self.movie = QMovie("./biu/biu10.gif")
        # 宠物大小
        self.movie.setScaledSize(QSize(200, 200))
        # 将动画添加到label中
        self.label.setMovie(self.movie)
        # 开始播放动画
        self.movie.start()
'''鼠标移动, 则宠物也移动'''
def mouseMoveEvent(self, event):
    if Qt.LeftButton and self.is_follow_mouse:
        self.move(event.globalPos() - self.mouse_drag_pos)
        event.accept()
'''鼠标释放时, 取消绑定'''
def mouseReleaseEvent(self, event):
    self.is_follow_mouse = False
    self.setCursor(QCursor(Qt.ArrowCursor))

2.4设置鼠标移入时变换:

设置鼠标碰到桌宠时变成小手的状态,这样更卡通化,显得更亲近:

def enterEvent(self, event):  # 鼠标移进时调用
    #print('鼠标移入')
    self.setCursor(Qt.ClosedHandCursor)  # 设置鼠标形状。需要from PyQt5.QtGui import QCursor,from PyQt5.QtCore import Qt
    '''
    Qt.PointingHandCursor   指向手            Qt.WaitCursor  旋转的圆圈
    ArrowCursor   正常箭头                 Qt.ForbiddenCursor 红色禁止圈
    Qt.BusyCursor      箭头+旋转的圈      Qt.WhatsThisCursor   箭头+问号
    Qt.CrossCursor      十字              Qt.SizeAllCursor    箭头十字
    Qt.UpArrowCursor 向上的箭头            Qt.SizeBDiagCursor  斜向上双箭头
    Qt.IBeamCursor   I形状                 Qt.SizeFDiagCursor  斜向下双箭头
    Qt.SizeHorCursor  水平双向箭头          Qt.SizeVerCursor  竖直双向箭头
    Qt.SplitHCursor                        Qt.SplitVCursor  
    Qt.ClosedHandCursor   非指向手          Qt.OpenHandCursor  展开手
    '''
    # self.unsetCursor()   #取消设置的鼠标形状

2.5设置鼠标右键菜单:

这里设置的右键菜单有的功能需要按照自己的电脑路径等进行自行修改:

# 当按右键的时候,这个event会被触发
def contextMenuEvent(self, event):
    menu = QMenu(self)
    code = menu.addAction("代码")
    py = menu.addAction("python—test")
    hide = menu.addAction("隐藏")
    quitAction = menu.addAction("退出")
    action = menu.exec_(self.mapToGlobal(event.pos()))
    if action == quitAction:
        qApp.quit()
    if action == hide:
        self.setWindowOpacity(0)
    if action == py:
        os.startfile("python练习.bat")
    if action == code:
        os.startfile("代码.bat")
'''退出程序'''
def quit(self):
    self.close()
    sys.exit()
'''显示'''
def showwin(self):
    self.setWindowOpacity(1)

2.6设置宠物状态的改变:

我们需要在我们点击桌宠时,桌宠就会对我们微笑。这样才具有人机交互性能。同时交互和随机状态还不能出现冲突。具体如下:

'''随机做一个动作'''
def randomAct(self):
    if not self.condition:
        print("状态变更")
        print(random.choice(self.pet1))
        self.movie = QMovie(random.choice(self.pet1))
        # 宠物大小
        self.movie.setScaledSize(QSize(200, 200))
        # 将动画添加到label中
        self.label.setMovie(self.movie)
        # 开始播放动画
        self.movie.start()
        self.condition=1
    else:
        print("状态还原")
        # 设置动画路径
        self.movie = QMovie("./biu/biu12.gif")
        # 宠物大小
        self.movie.setScaledSize(QSize(200, 200))
        # 将动画添加到label中
        self.label.setMovie(self.movie)
        # 开始播放动画
        self.movie.start()
        self.condition=0

2.7设置宠物对话窗口

:## 标题通过设置标签的方式作为对话窗口即可:

def talk(self):
    if not self.talk_condition:
        self.label1.setText(random.choice(self.sentence))
        self.label1.setStyleSheet("font: bold;font:15pt '楷体';color:yellow;background-color: black")  # 设置边框
        self.label1.adjustSize()
        self.talk_condition=1
    else:
        self.label1.setText("")
        self.label1.adjustSize()
        self.talk_condition = 0

在这里插入图片描述

图2 gif效果图

3、 源码

有问题的可以加QQ群 249603684讨论。完整代码下载链接:
CODE CHINA地址:https://codechina.csdn.net/qq_42279468/python_pet2_liqiujian

### 回答1: 制作桌宠的思路大概是这样的:先创建一个窗口,然后在窗口中放置一个小动画或者图片,让它随着鼠标移动移动Python 中可以使用 Pygame 库来实现这个功能。 以下是一个简单的桌宠程序示例: ```python import pygame pygame.init() # 窗口大小 WINDOW_WIDTH = 800 WINDOW_HEIGHT = 600 # 定义颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) # 创建窗口 screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("我的桌宠") # 加载图片 img_path = "pet.png" img = pygame.image.load(img_path) img_width, img_height = img.get_rect().size # 宠物位置 pet_pos_x = 0 pet_pos_y = 0 # 游戏循环 running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 获取鼠标位置 mouse_pos_x, mouse_pos_y = pygame.mouse.get_pos() # 计算宠物位置 pet_pos_x = mouse_pos_x - img_width // 2 pet_pos_y = mouse_pos_y - img_height // 2 # 绘制背景 screen.fill(WHITE) # 绘制宠物 screen.blit(img, (pet_pos_x, pet_pos_y)) # 更新窗口 pygame.display.update() pygame.quit() ``` 这个示例程序中,我们先创建了一个窗口,并加载了一张图片作为桌宠。在游戏循环中,获取鼠标位置,并计算出宠物的位置,然后在窗口中绘制宠物。最后更新窗口,完成桌宠的绘制。 ### 回答2: 使用Python制作一个桌宠可以通过以下几个步骤实现: 1. 引入必要的库:在开始之前,需要导入一些Python库来实现桌宠的功能。例如,可以使用Tkinter库来创建图形用户界面,使用Pillow库来处理图像,使用playsound库来播放声音等。 2. 创建桌宠窗口:使用Tkinter库创建一个空的窗口作为桌宠的显示界面。可以根据自己的喜好来设置窗口的大小、标题等属性。 3. 加载桌宠素材:用Pillow库加载桌宠的图片素材。可以使用Image类来加载和显示桌宠的不同状态,例如正常状态、休息状态、跳舞状态等。 4. 实现桌宠行为:使用Tkinter库的event循环,通过捕获鼠标点击、键盘事件等用户操作,来控制桌宠的行为。例如,点击桌宠时可以让它做一个动作,按下键盘时可以播放一段声音等。 5. 控制桌宠动画:使用Tkinter库的after方法来定期更新桌宠的动画。可以创建一个函数,每隔一段时间调用一次,用来更新桌宠的图片素材以创建动画效果。可以通过改变图片的位置、大小、旋转等属性让桌宠动起来。 6. 添加交互功能:为了让桌宠与用户进行交互,可以添加一些功能,例如点击桌宠时弹出一个对话框,接收用户的输入,并根据输入做出相应的反应。 7. 优化和扩展:完成基本的桌宠功能后,可以进一步优化代码,使得程序更加高效、稳定。同时,也可以尝试添加更多有趣的功能,例如给桌宠添加衣服、道具等,让用户可以自定义桌宠的外观和行为。 总之,使用Python制作一个桌宠需要熟悉相关的库和模块,通过合理的设计和编程来实现桌宠的各种功能。同时,也可以根据自己的想法和创造力,添加一些个性化的功能,使得桌宠更加有趣和有吸引力。 ### 回答3: 要使用Python制作一个桌宠,可以按照以下步骤进行: 1. 安装Python:首先,需要在计算机上安装Python。可以从Python官方网站上下载并安装最新版本的Python。 2. 导入必要的库:为了创建桌宠,需要使用特定的库,如Tkinter用于GUI界面和Pygame用于动画效果。可以使用命令`pip install`来安装这些库。 3. 创建GUI界面:使用Tkinter库创建一个空白窗口,作为桌宠的容器。可以设置窗口的大小和标题,以及背景色和透明度等属性。 4. 添加图像:在窗口中添加桌宠的图像,可以使用PNG或JPEG格式的图像文件。可以使用Python中的`PhotoImage`类加载图像文件,并使用`Label`类将图像添加到窗口中。 5. 响应事件:为了使桌宠具有互动功能,可以添加事件处理程序。例如,可以在点击桌宠图像时,执行一些特定的动作,如播放声音或显示对话框。 6. 添加动画效果:使用Pygame库可以为桌宠添加动画效果。可以定义不同的动作帧,并在循环中连续切换帧,以产生动画效果。例如,可以模拟桌宠的呼吸或移动。 7. 设置定时器:为了使桌宠看起来更生动,可以设置定时器来定期执行一些动作,如变换表情或抖动。可以使用Python中的`time`模块设置定时器,并定义回调函数来执行相应的动作。 8. 打包和分发:完成桌宠的设计和开发后,可以使用Python的打包工具打包应用程序,并分享给其他人使用。 通过以上步骤,使用Python可以轻松制作一个简单的桌宠。当然,如果希望桌宠具有更多功能和特效,还可以进一步研究和学习更高级的Python技术和库。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI看世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值