基于Python实现表白神器:一个浪漫的GUI应用程序

源码下载点击跳转免费下载源码

介绍:

本项目是一个使用Python编写的浪漫GUI应用程序,通常被称为“表白神器”。该程序设计用于在一个温馨的环境中向某个人表白。它使用Pygame库来创建一个窗口界面,用户可以通过点击按钮来回应表白。程序中还包含了背景音乐和图像,增加了浪漫气氛。

环境配置:

  • Python 3
  • Pygame库
  • Tkinter库(用于消息框)

配置文件:

 '''配置文件'''
import os# 窗口大小(width, height)
SCREENSIZE = (500, 260)
# 定义一些颜色
RED = (255, 0, 0)
BLACK = (0, 0, 0)
AZURE = (240, 255, 255)
WHITE = (255, 255, 255)
MISTYROSE = (255, 228, 225)
PALETURQUOISE = (175, 238, 238)
PAPAYAWHIP = (255, 239, 213)
LIGHTGRAY = (211, 211, 211)
GAINSBORO = (230, 230, 230)
WHITESMOKE = (245, 245, 245)
DARKGRAY = (169, 169, 169)
BLUE = (0, 0, 255)
DEEPSKYBLUE = (0, 191, 255)
SKYBLUE = (135, 206, 235)
LIGHTSKYBLUE = (135, 206, 250)
# 背景音乐路径
BGM_PATH = os.path.join(os.getcwd(), 'resources/music/bgm.mp3')
# 字体路径
FONT_PATH = os.path.join(os.getcwd(), 'resources/font/STXINGKA.TTF')
# 背景图片路径
BG_IMAGE_PATH = os.path.join(os.getcwd(), 'resources/images/bg.png')
# ICON路径
ICON_IMAGE_PATH = os.path.join(os.getcwd(), 'resources/images/icon.png')

项目分布:

  1. 初始化设置:设置Pygame窗口和基本参数。
  2. 按钮类定义:定义一个按钮类,用于创建和渲染按钮。
  3. 显示文字函数:定义一个函数来在屏幕上显示文本。
  4. 主函数:实现程序的主要逻辑和循环。
  5. 运行程序:调用主函数来运行整个程序。

详细代码:

 '''
Function:
	表白神器
Author:
	程序熊
'''
import sys
import cfg
import random
import pygame
from tkinter import Tk, messagebox


'''
Function:
	按钮类
Initial Args:
	--x, y: 按钮左上角坐标
	--width, height: 按钮宽高
	--text: 按钮显示的文字
	--fontpath: 字体路径
	--fontsize: 字体大小
	--fontcolor: 字体颜色
	--bgcolors: 按钮背景颜色
	--is_want_to_be_selected: 按钮是否想被玩家选中
	--screensize: 软件屏幕大小
'''
class Button(pygame.sprite.Sprite):
	def __init__(self, x, y, width, height, text, fontpath, fontsize, fontcolor, bgcolors, edgecolor, edgesize=1, is_want_to_be_selected=True, screensize=None, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.rect = pygame.Rect(x, y, width, height)
		self.text = text
		self.font = pygame.font.Font(fontpath, fontsize)
		self.fontcolor = fontcolor
		self.bgcolors = bgcolors
		self.edgecolor = edgecolor
		self.edgesize = edgesize
		self.is_want_tobe_selected = is_want_to_be_selected
		self.screensize = screensize
	'''自动根据各种情况将按钮绑定到屏幕'''
	def draw(self, screen, mouse_pos):
		# 鼠标在按钮范围内
		if self.rect.collidepoint(mouse_pos):
			# --不想被选中
			if not self.is_want_tobe_selected:
				while self.rect.collidepoint(mouse_pos):
					self.rect.left, self.rect.top = random.randint(0, self.screensize[0]-self.rect.width), random.randint(0, self.screensize[1]-self.rect.height)
			pygame.draw.rect(screen, self.bgcolors[0], self.rect, 0)
			pygame.draw.rect(screen, self.edgecolor, self.rect, self.edgesize)
		# 鼠标不在按钮范围内
		else:
			pygame.draw.rect(screen, self.bgcolors[1], self.rect, 0)
			pygame.draw.rect(screen, self.edgecolor, self.rect, self.edgesize)
		text_render = self.font.render(self.text, True, self.fontcolor)
		fontsize = self.font.size(self.text)
		screen.blit(text_render, (self.rect.x+(self.rect.width-fontsize[0])/2, self.rect.y+(self.rect.height-fontsize[1])/2))


'''在指定位置显示文字'''
def showText(screen, text, position, fontpath, fontsize, fontcolor, is_bold=False):
	font = pygame.font.Font(fontpath, fontsize)
	font.set_bold(is_bold)
	text_render = font.render(text, True, fontcolor)
	screen.blit(text_render, position)

 

def main():
    # 初始化
    pygame.init()
    screen = pygame.display.set_mode(cfg.SCREENSIZE, 0, 32)
    pygame.display.set_icon(pygame.image.load(cfg.ICON_IMAGE_PATH))
    pygame.display.set_caption('程序熊')
    # 背景音乐
    pygame.mixer.music.load(cfg.BGM_PATH)
    pygame.mixer.music.play(-1, 30.0)
    # 背景图片
    bg_image = pygame.image.load(cfg.BG_IMAGE_PATH)
    bg_image = pygame.transform.smoothscale(bg_image, (150, 150))
    # 实例化按钮(使用更现代的样式)
    button_yes = Button(x=20, y=cfg.SCREENSIZE[1]-70, width=120, height=35,
                        text='好呀', fontpath=cfg.FONT_PATH, fontsize=15, fontcolor=cfg.BLACK, edgecolor=cfg.SKYBLUE,
                        edgesize=2, bgcolors=[cfg.DARKGRAY, cfg.GAINSBORO], is_want_to_be_selected=True, screensize=cfg.SCREENSIZE)
    button_no = Button(x=cfg.SCREENSIZE[0]-140, y=cfg.SCREENSIZE[1]-70, width=120, height=35,
                       text='算了吧', fontpath=cfg.FONT_PATH, fontsize=15, fontcolor=cfg.BLACK, edgecolor=cfg.DARKGRAY,
                       edgesize=1, bgcolors=[cfg.DARKGRAY, cfg.GAINSBORO], is_want_to_be_selected=False, screensize=cfg.SCREENSIZE)
    # 主循环
    clock = pygame.time.Clock()
    while True:
        # --背景图片
        screen.fill(cfg.WHITE)
        screen.blit(bg_image, (cfg.SCREENSIZE[0]-bg_image.get_height(), 0))
        # --鼠标事件捕获
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN and event.button:
                if button_yes.rect.collidepoint(pygame.mouse.get_pos()):
                    root = Tk()
                    root.withdraw()
                    messagebox.showinfo('', '❤❤❤么么哒❤❤❤')
                    root.destroy()
                elif button_no.rect.collidepoint(pygame.mouse.get_pos()):
                    pygame.quit()
                    sys.exit()
        # --显示文字(使用更优雅的布局)
        showText(screen=screen, text='小姐姐, 我观察你很久了', position=(40, 50),
                 fontpath=cfg.FONT_PATH, fontsize=25, fontcolor=cfg.BLACK, is_bold=False)
        showText(screen=screen, text='做我女朋友好不好?', position=(40, 100),
                 fontpath=cfg.FONT_PATH, fontsize=25, fontcolor=cfg.BLACK, is_bold=True)
        # --显示按钮
        button_yes.draw(screen, pygame.mouse.get_pos())
        button_no.draw(screen, pygame.mouse.get_pos())
        # --刷新
        pygame.display.update()
        clock.tick(60)

if __name__ == '__main__':
    main()


'''主函数'''
def main():
	# 初始化
	pygame.init()
	screen = pygame.display.set_mode(cfg.SCREENSIZE, 0, 32)
	pygame.display.set_icon(pygame.image.load(cfg.ICON_IMAGE_PATH))
	pygame.display.set_caption('程序熊')
	# 背景音乐
	pygame.mixer.music.load(cfg.BGM_PATH)
	pygame.mixer.music.play(-1, 30.0)
	# biu爱心那个背景图片
	bg_image = pygame.image.load(cfg.BG_IMAGE_PATH)
	bg_image = pygame.transform.smoothscale(bg_image, (150, 150))
	# 实例化两个按钮
	button_yes = Button(x=20, y=cfg.SCREENSIZE[1]-70, width=120, height=35, 
						text='好呀', fontpath=cfg.FONT_PATH, fontsize=15, fontcolor=cfg.BLACK, edgecolor=cfg.SKYBLUE, 
						edgesize=2, bgcolors=[cfg.DARKGRAY, cfg.GAINSBORO], is_want_to_be_selected=True, screensize=cfg.SCREENSIZE)
	button_no = Button(x=cfg.SCREENSIZE[0]-140, y=cfg.SCREENSIZE[1]-70, width=120, height=35, 
					   text='算了吧', fontpath=cfg.FONT_PATH, fontsize=15, fontcolor=cfg.BLACK, edgecolor=cfg.DARKGRAY, 
					   edgesize=1, bgcolors=[cfg.DARKGRAY, cfg.GAINSBORO], is_want_to_be_selected=False, screensize=cfg.SCREENSIZE)
	# 是否点击了好呀按钮
	is_agree = False
	# 主循环
	clock = pygame.time.Clock()
	while True:
		# --背景图片
		screen.fill(cfg.WHITE)
		screen.blit(bg_image, (cfg.SCREENSIZE[0]-bg_image.get_height(), 0))
		# --鼠标事件捕获
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				# ----没有点击好呀按钮之前不许退出程序
				if is_agree:
					pygame.quit()
					sys.exit()
			elif event.type == pygame.MOUSEBUTTONDOWN and event.button:
				if button_yes.rect.collidepoint(pygame.mouse.get_pos()):
					button_yes.is_selected = True
					root = Tk()
					root.withdraw()
					messagebox.showinfo('', '❤❤❤么么哒❤❤❤')
					root.destroy()
					is_agree = True
		# --显示文字
		showText(screen=screen, text='小姐姐, 我观察你很久了', position=(40, 50), 
				 fontpath=cfg.FONT_PATH, fontsize=25, fontcolor=cfg.BLACK, is_bold=False)
		showText(screen=screen, text='做我女朋友好不好?', position=(40, 100), 
				 fontpath=cfg.FONT_PATH, fontsize=25, fontcolor=cfg.BLACK, is_bold=True)
		# --显示按钮
		button_yes.draw(screen, pygame.mouse.get_pos())
		button_no.draw(screen, pygame.mouse.get_pos())
		# --刷新
		pygame.display.update()
		clock.tick(60)


'''run'''
if __name__ == '__main__':
	main()

总结:

这个“表白神器”是一个小巧而精致的应用程序,它结合了Pygame的图形能力和Tkinter的简单消息框来创建一个既实用又有趣的用户界面。通过这个程序,用户可以向他们心仪的人表白,并立即得到回应。

  • 47
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序熊.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值