0

im making a game in pygame and I can't figure out how I can center some text in a rectangle. I draw the rectangle by using pygame.draw_rect(win, color, (x, y, w, h)) and text with text = font.render("text", 1, color). i know I can use text_rect = text.get_Rect(), to get a rect object of the text. but I don't know how to use those to center the text. I was searching for a solution online and couldn't find it

jasonkunda00
  • 31
  • 1
  • 6
  • get the center points of both rectangles, calculate the difference and then blit the text where it should be blitted – Matiiss Jul 13 '21 at 08:29

1 Answers1

1

You can get a rect from the surface generated by rendering your font. Then set the centre that rect to the centre of your rectangle. Then blit your font surface to the main surface.

Here's a small example that uses the mousewheel to enlarge and shrink the border rectangle to show that the font remains centred. Pressing a key randomises the text.

import random
import pygame
WIDTH, HEIGHT = 320, 240
pygame.init()
pygame.font.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# use the first available font
font = pygame.font.SysFont(pygame.font.get_fonts()[0], 60)
pygame.display.set_caption("Centering Font Rect")

text = "Initial Text"
widget = font.render(text, True, pygame.Color("seagreen"))
border = pygame.Rect(10, 10, WIDTH - 40, HEIGHT - 40)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            # change the text
            text = random.choice(["Short", "Long Looooong", ".", "+++", "ABC"])
            widget = font.render(text, True, pygame.Color("purple"))
        elif event.type == pygame.MOUSEWHEEL:
            # enlarge or shrink the border rect
            border.inflate_ip(event.y, event.y)
    screen.fill(pygame.Color("turquoise"))
    # draw border rect
    pygame.draw.rect(screen, pygame.Color("red"), border, width=1)
    # get the current font rect
    font_rect = widget.get_rect()
    # move rect to be centered on border rect
    font_rect.center = border.center
    screen.blit(widget, font_rect)
    # update display
    pygame.display.update()
pygame.quit()

This shows:

initial screen

Then after some resizing:

Resized

import random
  • 3,054
  • 1
  • 17
  • 22