鱼C论坛

 找回密码
 立即注册
查看: 988|回复: 3

[已解决]按钮封装时,按钮上的文本没显示,显示出不全的二按钮方框。问题出在哪呢。

[复制链接]
发表于 2023-6-4 13:34:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 xyyzzjw 于 2023-6-4 13:40 编辑

import pygame, random

RED=(205,0,0)
BLUE=(122,103,238)
WHITE=(255,255,255)
GREY=(200,200,200)
ROSE=(255,228,225)
GOLD=(255,215,0)
YELLOW=(238,180,34)
WHEAT=(245,222,179)
FIRE=(178,34,34)
PINK=(255,181,197)
GREEN=(0,205,0)
colors=[GREY,GOLD,GREEN,PINK,FIRE,WHEAT,RED,ROSE,BLUE,YELLOW]
color=colors[random.randint(0,len(colors)-1)]

WIN_WIDTH = 400
WIN_HEIGHT = 600

class Button:
    def __init__(self,window,title,rect,color=WHITE,bg_color=color):
        self.window=window
        self.title=title
        self.rect=rect
        self.color=color
        self.bg_color=bg_color

    def draw(self):
        pygame.draw.rect(self.window,self.bg_color,self.rect)
        text2=font.render(self.title,True,(255,0,0))
        text_x=self.rect[0]+self.rect[2]//2-text2.get_width()//2
        text_y=self.rect[1]+self.rect[3]//2-text2.get_height()//2
        self.window.blit(self.window,(text_x,text_y))







# 1.初始化操作
pygame.init()
# 2.创建游戏窗口
# set_mode(大小)
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
pygame.display.set_caption("封装按钮")
# 设置背景颜色(否则为黑色)
window.fill(WHITE)
# ==============显示静态内容========================
font = pygame.font.SysFont("kaiti", 20)
button=Button(window,"取消",(100,200,70,40))
button.draw()
pygame.display.flip()
while True:
    # ==============游戏帧刷新(显示动态)=================
    # 检测事件
    for event in pygame.event.get():
        # 检测关闭按钮被点击的事件
        if event.type == pygame.QUIT:
            # 退出,要保存好数据哦
            exit()


        pygame.display.update()
最佳答案
2023-6-4 13:38:44
你在定义Button类的 draw 方法时,尝试把按钮背景渲染到游戏窗口上,然后,你试图在上面渲染文字。这里出了问题,你不应该将 self.window 作为 blit 方法的第一个参数,应该是你创建的文本对象,像这样:
self.window.blit(text2,(text_x,text_y))

这就是你为什么看不到按钮上的文本的原因。你试图将窗口自身贴到窗口上,而不是你创建的文本对象。 blit 方法应该有一个图像对象作为第一个参数(在这个情况下,是 text2 对象),和一个坐标元组作为第二个参数。坐标元组决定了图像对象应该在窗口的哪个位置被渲染。

所以,你的Button类中的 draw 方法应该是这样的:
class Button:
    def __init__(self,window,title,rect,color=WHITE,bg_color=color):
        self.window=window
        self.title=title
        self.rect=rect
        self.color=color
        self.bg_color=bg_color

    def draw(self):
        pygame.draw.rect(self.window,self.bg_color,self.rect)
        text2=font.render(self.title,True,(255,0,0))
        text_x=self.rect[0]+self.rect[2]//2-text2.get_width()//2
        text_y=self.rect[1]+self.rect[3]//2-text2.get_height()//2
        self.window.blit(text2,(text_x,text_y))

记住,这个修改需要在你的主游戏循环开始之前就执行,这样,每次窗口更新时, draw 方法都会被正确地调用,按钮的文本就会被正确地显示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 13:38:44 | 显示全部楼层    本楼为最佳答案   
你在定义Button类的 draw 方法时,尝试把按钮背景渲染到游戏窗口上,然后,你试图在上面渲染文字。这里出了问题,你不应该将 self.window 作为 blit 方法的第一个参数,应该是你创建的文本对象,像这样:
self.window.blit(text2,(text_x,text_y))

这就是你为什么看不到按钮上的文本的原因。你试图将窗口自身贴到窗口上,而不是你创建的文本对象。 blit 方法应该有一个图像对象作为第一个参数(在这个情况下,是 text2 对象),和一个坐标元组作为第二个参数。坐标元组决定了图像对象应该在窗口的哪个位置被渲染。

所以,你的Button类中的 draw 方法应该是这样的:
class Button:
    def __init__(self,window,title,rect,color=WHITE,bg_color=color):
        self.window=window
        self.title=title
        self.rect=rect
        self.color=color
        self.bg_color=bg_color

    def draw(self):
        pygame.draw.rect(self.window,self.bg_color,self.rect)
        text2=font.render(self.title,True,(255,0,0))
        text_x=self.rect[0]+self.rect[2]//2-text2.get_width()//2
        text_y=self.rect[1]+self.rect[3]//2-text2.get_height()//2
        self.window.blit(text2,(text_x,text_y))

记住,这个修改需要在你的主游戏循环开始之前就执行,这样,每次窗口更新时, draw 方法都会被正确地调用,按钮的文本就会被正确地显示。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 13:46:35 | 显示全部楼层
学习过程中,找bug好辛苦哦。自己就是找不出来。谢谢大佬。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 13:49:12 | 显示全部楼层
xyyzzjw 发表于 2023-6-4 13:46
学习过程中,找bug好辛苦哦。自己就是找不出来。谢谢大佬。


chat2.jinshutuan.com,ChatGpt你值得拥有
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 23:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表