簡體   English   中英

如何更改 Pygame 的按鈕 class 中的文本?

[英]How do I change the text in a Button class for Pygame?

我為我的游戲制作了一個按鈕 class ,我想在單擊它們時將文件中的不同文本分配給顯示的按鈕,但是在分配初始分配后我什至無法更改文本。 每當我運行b.text = "New text"並將其打印出來時,控制台都會顯示新文本,但游戲 window 仍然會顯示“占位符文本”。

編碼:

import pygame, sys
pygame.init()

screen = pygame.display.set_mode((900,600),0,32) 
clock = pygame.time.Clock() 
font = pygame.font.Font('freesansbold.ttf', 32) 


class Button():
    def __init__(self, text, x, y):
        self.text = text       
        self.render = font.render(self.text, True, 'white')
        self.text_width = self.render.get_width()
        self.text_height = self.render.get_height()
        
        self.box = pygame.Surface((self.text_width, self.text_height)) 
        self.box.set_alpha(0) 
        screen.blit(self.box, (x, y)) 

        self.rect = self.render.get_rect()
        self.rect.topleft = (x, y)
        self.clicked = False
        
        
    def draw(self):
        screen.blit(self.box, (self.rect.x, self.rect.y))
        screen.blit(self.render, (self.rect.x, self.rect.y))   
        
        pos = pygame.mouse.get_pos()
        if self.rect.collidepoint(pos):
            self.box.set_alpha(100) 
            self.box.fill((255, 255, 255))
            
            if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
                self.clicked = True
        
            if pygame.mouse.get_pressed()[0] == 0:
                self.clicked = False
        else:
            self.box.set_alpha(0) 
            
        return self.clicked


b = Button("placeholder text", 100, 100)

while True:
    clock.tick(30)  

    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            pygame.quit() 
            sys.exit() 
        

    screen.fill('blue')
    b.text = "new text"
    b.draw()

    pygame.display.update()

您必須再次渲染文本。 向 class 添加一個更新文本的方法。 更新高亮后繪制文本和框:

class Button():
    def __init__(self, text, x, y):
         self.rect = pygame.Rect(x, y, 0, 0)
         self.updateText(text)
         self.clicked = False  

    def updateText(self, text):
         self.text = text   
         self.render = font.render(self.text, True, 'white')
         self.text_width = self.render.get_width()
         self.text_height = self.render.get_height()
         self.box = pygame.Surface((self.text_width, self.text_height)) 
         self.rect = self.render.get_rect(topleft = self.rect.topleft)
        
    def draw(self):       
        pos = pygame.mouse.get_pos()
        if self.rect.collidepoint(pos):
            self.box.set_alpha(100) 
            self.box.fill((255, 255, 255))
            
            if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
                self.clicked = True
        
            if pygame.mouse.get_pressed()[0] == 0:
                self.clicked = False
        else:
            self.box.set_alpha(0) 

        screen.blit(self.box, (self.rect.x, self.rect.y))
        screen.blit(self.render, (self.rect.x, self.rect.y))   
            
        return self.clicked

調用updateText

b.text = "New text"

b.updateText("New text")

正如@Rabbid76 所說:

您必須再次渲染文本

您還可以使用@property裝飾器來更輕松地更改文本:

class Button():
    render: pygame.font.Font
    text_width: int
    text_height: int
    box: pygame.Surface
    rect: pygame.Rect


    def __init__(self, text, x, y):
        self._text = ""
        self.text = text       
        self.clicked = False
    
    @property
    def text(self):
        return self._text
    
    @text.setter
    def text(self, value):
        self._text = value
        self.render = font.render(self.text, True, 'white')
        self.text_width = self.render.get_width()
        self.text_height = self.render.get_height()
        
        self.box = pygame.Surface((self.text_width, self.text_height)) 
        self.box.set_alpha(0) 
        screen.blit(self.box, (x, y)) 

        self.rect = self.render.get_rect()
        self.rect.topleft = (x, y)

    # Rest of your code goes here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM