import pygame pygame.init()   SIZE = WIDTH, HEIGHT = (1024, 720) FPS = 30 screen = pygame.display.set_mode(SIZE, pygame.RESIZABLE) clock = pygame.time.Clock()   def blit_text(surface, text, pos, font, color=pygame.Color('black')):     words = [word.split(' ') for word in text.splitlines()]  # 2D array where each row is a list of words.     space = font.size(' ')[0]  # The width of a space.     max_width, max_height = surface.get_size()     x, y = pos     for line in words:         for word in line:             word_surface = font.render(word, 0, color)             word_width, word_height = word_surface.get_size()             if x + word_width >= max_width:                 x = pos[0]  # Reset the x.                 y += word_height  # Start on new row.             surface.blit(word_surface, (x, y))             x += word_width + space         x = pos[0]  # Reset the x.         y += word_height  # Start on new row.   text = "This is a really long sentence with a couple of breaks.\nSometimes it will break even if there isn't a break " \        "in the sentence, but that's because the text is too long to fit the screen.\nIt can look strange sometimes.\n" \        "This function doesn't check if the text is too high to fit on the height of the surface though, so sometimes " \        "text will disappear underneath the surface" font = pygame.font.SysFont('Arial', 64)  while True:      dt = clock.tick(FPS) / 1000      for event in pygame.event.get():         if event.type == pygame.QUIT:             quit()      screen.fill(pygame.Color('white'))     blit_text(screen, text, (20, 20), font)     pygame.display.update()

Read more of this post