Pygame Python 字体

Pygame Python font

昨天我有一个关于字形字体和 pygame 字体宽度的问题我有一些关于这个的代码在这里是代码:

import pygame

pygame.init()
win = pygame.display.set_mode((800, 600))
font = pygame.font.Font("freesansbold.ttf", 32)
i = 0
text = "hello how are you?"
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    letter = text[i]
    text_1 = font.render(letter, True, (255, 255, 255))

    bw, bh = font.size(letter)
    glyph_rect = pygame.mask.from_surface(text_1).get_bounding_rects()
    # print(glyph_rect)
    if glyph_rect:
        gh = glyph_rect[0].height
        print(f"{glyph_rect[0]}")
        print(f'letter {letter}  bitmap height: {bh}  glyph height: {gh} width = {glyph_rect[0].width} width_2 = {bw}')

    win.fill((0, 0, 0))
    win.blit(text_1, (0, 0))
    pygame.display.update()

    i += 1
    run = i < len(text)

pygame.quit()
# win.blit(text_1, (0, 0))

我知道为什么字形高度不同,因为我在一个问题中问过这个问题并且得到了答案,但为什么字形宽度总是比实际宽度小一点?有人可以详细解释一下吗

字宽不同是因为字与字连字时有一个space。 glyph_rect[0].width 是字形的宽度。 bw 是位图的宽度。字形没有填满整个位图,两边都有一些 space。


您可以使用以下程序对此进行调查(每个字母显示 1 秒):

import pygame

pygame.init()
win = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
font = pygame.font.Font("freesansbold.ttf", 200)
i = 0
text = "hello how are you?"
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    letter = text[i]
    text_1 = font.render(letter, True, (0, 0, 0))
    text_draw = font.render(letter, True, (0, 0, 0), (255, 255, 255))

    bw, bh = font.size(letter)
    glyph_rect = pygame.mask.from_surface(text_1).get_bounding_rects()
    if glyph_rect:
        gh = glyph_rect[0].height
        print(f"{glyph_rect[0]}")
        print(f'letter {letter}  bitmap height: {bh}  glyph height: {gh} width = {glyph_rect[0].width} width_2 = {bw}')

    win.fill((128, 128, 128))
    win.blit(text_draw, (100, 100))
    for r in glyph_rect:
        draw_rect = r.move(100, 100)
        pygame.draw.rect(win, (255, 0, 0), draw_rect, 3)
    pygame.display.update()

    i += 1
    run = i < len(text)
    clock.tick(1)

pygame.quit()