【问题标题】:How do I change the text in a Button class for Pygame?如何更改 Pygame 的 Button 类中的文本?
【发布时间】:2022-01-22 01:35:38
【问题描述】:

我为我的游戏创建了一个 Button 类,我想在每次单击它们时将文件中的不同文本分配给显示的按钮,但是在分配初始分配后我什至无法更改文本.每当我运行b.text = "New text" 并将其打印出来时,控制台都会显示新文本,但游戏窗口仍然会显示“占位符文本”。

代码:

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()

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您必须再次渲染文本。向更新文本的类添加一个方法。更新高亮后绘制文本和框:

    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")
    

    【讨论】:

      【解决方案2】:

      正如@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
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-07
        • 2021-07-21
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 2014-05-13
        相关资源
        最近更新 更多