百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

用 Python 实现浪漫表白程序

off999 2024-11-21 19:15 14 浏览 0 评论

作者 | 李秋键
出品 | CSDN(ID:CSDNnews)

相信很多小伙伴都曾在抖音、快手以及 B 站等平台刷到过表白程序,不论是各种的程序制作爱心或者是程序制作心动符号等,在各个平台很受欢迎。但是其中大多数形式都已经被公众所知晓,且缺乏流动性。故今天我们将自行设计一个表白浪漫程序,具有动态开关宠物、照片墙、弹窗提示以及 turtle 画图等功能。其中具体效果图如下:

本浪漫程序的技术路线分为以下几个部分:

  1. 通过 Pyqt5 模块构建透明窗口,并设置聊天窗等功能,设置右键功能,使其功能启动“浪漫程序“;

  2. 开始宠物系统再通过多线程启动其他程序,包含弹窗程序,海龟画图程序等;

  3. 生成爱心照片墙:通过 2.py 程序生成爱心照片墙,并缩放至1000×806;

  4. 海龟画图:运行 1.py 程序实现海龟画图,绘制玫瑰花和爱心;

其中的程序操作流程:

首先运行 2.py 生成照片墙,并缩放至 1000×806;然后运行 biu.py 启动宠物系统,通过邮件宠物运行整个程序,最终程序会慢慢完成,形成动态程序效果。

具体功能的形成分为以下几个部分介绍,最终代码也会免费放置文末的百度网盘中,供大家学习参考。

照片墙生成程序


其中程序运行基本步骤为:首先需要将需要生成的照片放置 photo 文件夹中,然后直接运行 2.py 程序即可。

其中的照片墙素材如下:

代码思路如下:

首先自定义二维 list,其中 1 表示填充空白块,0 表示填充读取到的照片;然后读取照片路径,并通过 random 实现随机化,避免相近图片排在一起;接着通过 Image 库读入图片,对读取到得图像集遍历绘制至其中。其中具体部分代码如下所示:

random.shuffle(imgs)img_h = img_w = 250rows = len(map)columns = len(map[0])figure = Image.new("RGB", (img_w * columns, img_h * rows), "white")count = 0for i in range(len(map)): for j in range(len(map[i])): if map[i][j] == 1: continue else: try: image = Image.open(os.path.join(img_dir, imgs[count])) except: continue image = image.resize((img_w, img_h)) figure.paste(image, (img_w * j, img_h * i)) count += 1

这里用游戏中的图片作为生成素材,最终生成的照片墙如下:

启动宠物程序


启动宠物程序基本流程为:首先建立表白语料库作为聊天窗口展示;然后自行选择一些具有表白意义的 gif 动态图作为宠物动作;最后通过 Pyqt5 构建透明窗口程序,通过多线程实现动作交替以及右键鼠标功能等。

1、其中构建的语料库文件如下,存储到“data.txt“中,并通过换行实现语句分割,其中“data.txt”直接放置和程序同一目录即可,可参照文末提供的原始程序放置位置:

2、构建的宠物动作动态图素材,将找到的素材放置biu文件夹下,如下图所示:

3、程序实现。程序实现主要分为初始化透明窗口、设置托盘选项、右键菜单功能、设置聊天对话框功能以及动作时间交替等部分,整体程序的实现有 pyqt5 构成。

其中具体知识点分为以下几个部分:

1、Pyqt5 基本流程

1.1 类的定义和初始化

为了使程序更加规范,我们定义整体的类变量,方便调用。

其中分为下面几步:

1、时间变量初始化

2、调用随时间图案变化函数

3、窗口位置和边框初始化

4、计时器初始化。

5、鼠标跟踪定义

1.2 透明窗口的定义

初始化中加入 self.setAttribute(Qt.WA_TranslucentBackground) 实现背景透明效果。

1.3 不规则窗口函数的建立

主要使用 Qt.AvoidDither|Qt.ThresholdAlphaDither|Qt.ThresholdDither 参数实现不规则窗口。同时还需要规定不规则窗口尺寸等等,主要定义函数 mypix 进行调用

1.4 鼠标设置

可通过初始化 self.setMouseTracking(False) 设置鼠标移动跟踪是否有效。设置为 True 时,只要鼠标在窗口内移动时 mouseMoveEvent 事件就能捕获

设置为 False 时(默认),只有鼠标键按下并在窗口内移动时 mouseMoveEvent 事件才能捕获

注意只能是 QWidget,如果是 QMainwindow,则无效

self.hasMouseTracking()返回设置的状态

1.5 创建多线程时间变化

定义时间变化函数,一个线程用来更新动画,另一个用来更新对话框。

1.6 对话框函数定义

如果鼠标触碰到宠物的话就弹出对话。

其中部分代码如下:

def __init__(self): 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() # 是否跟随鼠标 self.is_follow_mouse = False self.move(1650,20) with open("data.txt", "r") as f: text = f.read() self.sentence = text.split("\n")

2、鼠标控制

2.1 鼠标点击事件

鼠标点击 icon 传递的信号会带有一个整形的值,1是表示单击右键,2是双击,3是单击左键。

2.2 鼠标按下调用

通过 n = event.button() 用来判断是哪个鼠标健触发了事件【返回值:0 1 2 4】。

其中:

  • QtCore.Qt.NoButton - 0 - 没有按下鼠标键

  • QtCore.Qt.LeftButton -1 -按下鼠标左键

  • QtCore.Qt.RightButton -2 -按下鼠标右键

  • QtCore.Qt.Mion 或 QtCore.Qt.MiddleButton -4 -按下鼠标中键

通过 nn = event.buttons() 返回前面所列枚举值的组合,用于判断同时按下了哪些键

2.3 鼠标松开

定义函数 mouseReleaseEvent,鼠标键释放时调用参数1:鼠标的作用对象;参数2:鼠标事件对象,用来保存鼠标数据。

2.4 鼠标拖动事件

定义函数 mouseMoveEvent 通过 self.hasMouseTracking() 获取移动值。然后获得鼠标坐标。控制窗口随之移动

2.5 鼠标移出和滚轮事件

鼠标移出定义函数 leaveEvent,滚轮 wheelEvent。

2.6 鼠标右键事件

鼠标移出定义函数contextMenuEvent,在右键菜单里通过cmenu.addAction加入标签。action = cmenu.exec_(self.mapToGlobal(e.pos())) 获取鼠标点击标签,用来判断用户点击了哪一个标签。

其中部分代码如下:

# 当按右键的时候,这个event会被触发def contextMenuEvent(self, event): menu = QMenu(self) video = menu.addAction("浪漫程序") quitAction = menu.addAction("退出") action = menu.exec_(self.mapToGlobal(event.pos())) if action == quitAction: qApp.quit() if action == video: import threading def t2(): os.system("python 1.py") t22=threading.Thread(target=t2) t22.start()

3、动态宠物控制

3.1 根据事件的动作判定

这里定义点击等动作自动回馈等等。

3.2 宠物图片更换

定义列表用来存储素材关系。

3.3 程序退出事件

通过quit函数控制退出

def quit(self): self.close() sys.exit()

3.4 整体执行

从main入口开始执行整体类

if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon("1.jpg")) # 创建一个主窗口 mainWin = DemoWin() # 显示 mainWin.show() # 主循环 sys.exit(app.exec_())

最终实现效果如下如所示:

turtle 画图


这里通过海龟画图绘制爱心和玫瑰,实现动态绘图效果。通过 pensize 函数定义画笔大小;speed 定义速度;Color 定义颜色;等等

其中部分代码如下:

wn = turtle.Screen()wn.screensize()wn.setup(width=1.0, height=1.0)wn.register_shape('1.gif')rocket = turtle.Turtle()rocket.shape('1.gif')color('red', 'pink')getscreen().tracer(1, 0)heart(100, 0, 0.7)go_to(80, 70)write("小明", font=("楷体", 18, "normal"))setheading(0)heart(-80, -100, 1)go_to(-110, 15)write("小红", font=("宋体", 20, "normal"))go_to(40, -80)write("三生三世皆是你!", move=True, align="left", font=("arial", 22, "italic"))time.sleep(2)wn.clear()

弹窗程序


弹窗程序非常简单,通过 tkinter 构建弹窗即可,再定义窗口和字体大小颜色等等即可。然后循环多线程实现。

其中部分代码如下:

def dow(): window = tk.Tk() width = window.winfo_screenwidth() height = window.winfo_screenheight() a = random.randrange(0, width) b = random.randrange(0, height) window.title('小明表白小红') # 弹窗的名字window.geometry("200x50" + "+" + str(a) + "+" + str(b)) # 弹窗大小 tk.Label(window, text='小明表白小红!', # 标签的文字  bg='Red', # 背景颜色 font=('楷体', 17), # 字体和字体大小 width=15, height=2 # 标签长宽 ).pack() # 固定窗口位置 window.mainloop()threads = []for i in range(100): t = threading.Thread(target=dow) threads.append(t) time.sleep(0.1) threads[i].start()

效果如下:

完整代码详见:https://gitcode.net/qq_42279468/gaobai/-/tree/master

相关推荐

python pip 命令 参数(python pip命令用不了)

usage:python[option]...[-ccmd|-mmod|file|-][arg]...Options(andcorrespondingenvironm...

Python 包管理:uv 来了!比 pip 快 100 倍的神器,开发者的终极选择?

为什么Python开发者需要uv?Python生态虽繁荣,但包管理一直是痛点:pip安装慢如蜗牛、依赖冲突让人头秃、虚拟环境配置繁琐……直到uv横空出世!这个用Rust语言打造的...

UV:Python包管理的未来已来!比pip快100倍的新选择

引言Python开发者们,是否厌倦了pip的缓慢安装速度?是否希望有一个更快、更现代、更高效的包管理工具?今天,我要向大家介绍一个革命性的Python包管理工具——UV!UV由Rust编写,是pip和...

「Python」 常用的pip命令和Django命令

pip命令如何根据关键词找到PyPI(Python包仓库)上的可用包#方法1:直接访问PyPI官网,输入关键词搜索#方法2#为何不用pipsearchdjango?因为这个命令已不可...

python包管理工具pip freeze详解(python工具包怎么用)

freeze就像其名字表示的意思一样,主要用来以requirement的格式输出已安装的包,这里我们主要讨论以下3个选项:--local、--user、--pathlocal--local选项一般用在...

python包管理工具pip config详解(python的pulp包)

pipconfig主要包含以下子命令:set、get、edit、list、debug、unset。下面我们逐一介绍下它们。pipconfigset这个命令允许我们以name=value的形式配...

pip常用命令,学Python不会这个寸步难行哦(26)

小朋友们好,大朋友们好!我是猫妹,一名爱上Python编程的小学生。欢迎和猫妹一起,趣味学Python。今日主题学习下pip的使用。pip什么是pippip全称PythonPackageIndex...

Python pip 包管理需知(python的包管理)

简介在Python编程中,pip是一个强大且广泛使用的包管理工具。它使我们能够方便地安装、升级和管理Python包。无论是使用第三方库还是分享自己的代码,pip都是我们的得力助手。本文将深入解析pip...

比pip快100倍的Python包安装工具(python如何用pip安装包)

简介uv是一款开源的Python包安装工具,GitHubstar高达56k,以性能极快著称,具有以下特性(官方英文原文):Asingletooltoreplacepip,pip-tool...

Python安装包总报错?这篇解决指南让你告别pip烦恼!

在Python开发中,pip是安装和管理第三方包的必备工具,但你是否经常遇到各种报错,比如无法创建进程、权限不足、版本冲突,甚至SSL证书错误?这些问题不仅浪费时间,还让人抓狂!别担心!本文整理了...

pip vs pipx: Python 包管理器,你选择哪个?

高效的包管理对于Python开发至关重要。pip和pipx是两个最常用的工具。虽然两者都支持安装Python包,但它们的设计和用例却大相径庭。本文将探讨这些差异,解释何时使用每种工具,并...

【python】5分钟掌握pip(包管理)操作

安装一个软件包从庞大的仓库中找到一个库,将其导入您的环境:pipinstallnumpy2.已安装软件包列表调查您领域内存在的库的概要,注意它们的版本:piplist3.升级软件包赋予已安装...

Python pip安装与使用步骤(python的pip安装方法)

安装和使用Python的包管理工具pip是管理Python包和依赖项的基础技能。以下是详细的步骤:安装pip使用系统包管理器安装Windows:通常,安装Python时会自动安装p...

Python自动化办公应用学习笔记3—— pip工具安装

3.1pip工具安装最常用且最高效的Python第三方库安装方式是采用pip工具安装。pip是Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。pip是Python官方提...

Python文件压缩神器:ZipFile功能全解析,支持一键压缩和解压

在Python中处理ZIP文件时,zipfile模块是最常用的工具。它提供了创建、读取、修改ZIP文件的完整功能,无需依赖外部命令。本文将通过核心函数、实战案例和避坑指南,带你掌握这个高效的文件处理模...

取消回复欢迎 发表评论: