如何更改 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 所说:
You have to render the text again
您还可以使用 @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
我为我的游戏制作了一个按钮 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 所说:
You have to render the text again
您还可以使用 @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