Pygame Python font

Viewed 154

I have a question regarding the glyph a font and the pygame width of a font yesterday i some code regarding this here is the code:

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

I know why the glyph height is diffrent because i asked that in a question and i got a answer for that but why is the glyph width always a bit less than the actual width? Can someone explain me in detail

1 Answers

The width is different because there is a space between characters when they are connected to words. glyph_rect[0].width is the width of the glyph. bw is the width of the bitmap. The glyph does not fill the entire bitmap and has some space on both sides.


You can investigate this with the following program (each letter is displayed for 1 second):

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