如何在矩形内添加文本?

2024-03-29 01:45:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我将对象的类fences定义如下:

class GeoFence(pygame.sprite.Sprite):
    def __init__(self, rect, risk_level, *groups):
        self._layer = 1
        pygame.sprite.Sprite.__init__(self, groups)
        self.image = pygame.surface.Surface((rect.width, rect.height))
        self.image.fill(GREEN)
        self.rect = rect
        self.risk_level = risk_level
        self.font = pygame.font.SysFont('Arial', 25)
        screen.blit(self.font.render(risk_level, True, (255,0,0)), (200, 100))

每个对象fence都是一个绿色矩形。我想在这个矩形内显示一个文本。文本由一个字符串risk_level定义,该字符串从列表risks中随机选择。在

^{pr2}$

此代码不会失败,但标题不会显示在屏幕上的任何位置。在


Tags: 对象rectimage文本self定义initlevel
1条回答
网友
1楼 · 发布于 2024-03-29 01:45:41

问题是,当创建精灵时,screen曲面的坐标(200, 100)处的文本是blitting的,因此在下一帧中清除屏幕时,文本将消失。在

为了在GeoFence对象上blit文本,您需要将其blit到self.image上的坐标(0, 0)(如果它应该左上对齐的话)。在

如果曲面应该适合文本的大小,则可以先呈现文本表面,并将其大小用作self.image曲面的大小。在

import random
import pygame


pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
BG_COLOR = pygame.Color('gray12')
GREEN = pygame.Color('green')
FONT = pygame.font.SysFont('Arial', 25)


class GeoFence(pygame.sprite.Sprite):

    def __init__(self, rect, risk_level, *groups):
        self._layer = 1
        pygame.sprite.Sprite.__init__(self, groups)
        text_surface = FONT.render(risk_level, True, (255,0,0))
        self.image = pygame.surface.Surface(text_surface.get_size())
        self.image.fill(GREEN)
        self.image.blit(text_surface, (0, 0))
        self.rect = self.image.get_rect(topleft=rect.topleft)
        self.risk_level = risk_level


all_sprites = pygame.sprite.LayeredUpdates()
fences = pygame.sprite.Group()

risks = ["HIGH","MEDIUM","LOW"]
for rect in (pygame.Rect(510,150,75,52), pygame.Rect(450,250,68,40),
             pygame.Rect(450,370,68,48)):
    risk = random.choice(risks)
    GeoFence(rect, risk, all_sprites, fences)

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    all_sprites.update()

    screen.fill(BG_COLOR)
    all_sprites.draw(screen)
    pygame.display.flip()
    clock.tick(60)

也可以向^{}传递另一种颜色,该颜色将用作背景色。这样可以使代码稍微缩短一点:

^{pr2}$

如果要使文本居中,请为文本创建另一个rect,将其center坐标设置为self.rect.center,然后将其用作文本的blit位置。执行此操作时,self.rect仍应处于默认位置(0,0)。在

def __init__(self, rect, risk_level, *groups):
    self._layer = 1
    pygame.sprite.Sprite.__init__(self, groups)
    text_surface = FONT.render(risk_level, True, (255,0,0))
    self.image = pygame.surface.Surface(
        (text_surface.get_width()+110, text_surface.get_height()+20))
    self.image.fill(GREEN)
    # Create the rect, but don't set the coordinates yet.
    self.rect = self.image.get_rect()
    # Set the center of the text_rect to the center of the self.rect.
    text_rect = text_surface.get_rect(center=self.rect.center)
    # Then blit the text at the text_rect and it will be centered.
    self.image.blit(text_surface, text_rect)
    # Afterwards set the rect to the desired position.
    self.rect.topleft = rect.topleft

相关问题 更多 >