Here is a simple font manager class. Not very sophisticated, but it gets the job done. See the docstrings in the code for more details.

Save the code to a file and run from the commandline to see a trivial demo.

import pygame from pygame.locals import * class cFontManager: ''' A simple class used to manage Font objects and provide a simple way to use them to draw text on any surface. Directly import this file to use the class, or run this file from the command line to see a trivial sample. Written by Scott O. Nelson ''' def __init__(self, listOfFontNamesAndSizesAsTuple): ''' Pass in a tuple of 2-item tuples. Each 2-item tuple is a fontname / size pair. To use the default font, pass in a None for the font name. Font objects are created for each of the pairs and can then be used to draw text with the Draw() method below. Ex: fontMgr = cFontManager(((None, 24), ('arial', 18), ('arial', 24), ('courier', 12), ('papyrus', 50))) TODO: add support for bold & italics ''' self._fontDict = {} for pair in listOfFontNamesAndSizesAsTuple: assert len(pair) == 2, \ "Pair must be composed of a font name and a size - ('arial', 24)" if pair[0]: fontFullFileName = pygame.font.match_font(pair[0]) assert fontFullFileName, 'Font: %s Size: %d is not available.' % pair else: fontFullFileName = None # use default font self._fontDict[pair] = pygame.font.Font(fontFullFileName, pair[1]) def Draw(self, surface, fontName, size, text, rectOrPosToDrawTo, color, alignHoriz='left', alignVert='top', antialias=False): ''' Draw text with the given parameters on the given surface. surface - Surface to draw the text onto. fontName - Font name that identifies what font to use to draw the text. This font name must have been specified in the cFontManager rectOrPosToDrawTo - Where to render the text at. This can be a 2 item tuple or a Rect. If a position tuple is used, the align arguments will be ignored. color - Color to draw the text with. alignHoriz - Specifies horizontal alignment of the text in the rectOrPosToDrawTo Rect. If rectOrPosToDrawTo is not a Rect, the alignment is ignored. alignVert - Specifies vertical alignment of the text in the rectOrPosToDrawTo Rect. If rectOrPosToDrawTo is not a Rect, the alignment is ignored. antialias - Whether to draw the text anti-aliased or not. ''' pair = (fontName, size) assert pair in self._fontDict, \ 'Font: %s Size: %d is not available in cFontManager.' % pair fontSurface = self._fontDict[(fontName, size)].render(text, antialias, color) if isinstance(rectOrPosToDrawTo, tuple): surface.blit(fontSurface, rectOrPosToDrawTo) elif isinstance(rectOrPosToDrawTo, pygame.Rect): fontRect = fontSurface.get_rect() # align horiz if alignHoriz == 'center': fontRect.centerx = rectOrPosToDrawTo.centerx elif alignHoriz == 'right': fontRect.right = rectOrPosToDrawTo.right else: fontRect.x = rectOrPosToDrawTo.x # left # align vert if alignVert == 'center': fontRect.centery = rectOrPosToDrawTo.centery elif alignVert == 'bottom': fontRect.bottom = rectOrPosToDrawTo.bottom else: fontRect.y = rectOrPosToDrawTo.y # top surface.blit(fontSurface, fontRect) def RunDemo(): '''A simple demo of the use of the cFontManager class''' pygame.init() pygame.display.set_mode((640, 480)) screen = pygame.display.get_surface() clock = pygame.time.Clock() # a font of None means to use the default font fontMgr = cFontManager(((None, 24), (None, 48), ('arial', 24))) doQuit = False while not doQuit: clock.tick(60) # run at 60 fps screen.fill((0, 0, 0)) white = (255, 255, 255) gray = (64, 64, 64) fontMgr.Draw(screen, None, 48, 'Default font, 48', (0, 50), white) fontMgr.Draw(screen, None, 24, 'Default font, 24', (0, 0), white) rect = pygame.Rect(0, 100, 640, 60) pygame.draw.rect(screen, gray, rect) fontMgr.Draw(screen, 'arial', 24, 'Arial 24 top left', rect, white, 'left', 'top') rect.top += 75 pygame.draw.rect(screen, gray, rect) fontMgr.Draw(screen, 'arial', 24, 'Arial 24 centered', rect, white, 'center', 'center') rect.top += 75 pygame.draw.rect(screen, gray, rect) fontMgr.Draw(screen, 'arial', 24, 'Arial 24 bottom right', rect, white, 'right', 'bottom') rect.top += 75 pygame.draw.rect(screen, gray, rect) fontMgr.Draw(screen, 'arial', 24, 'Arial 24 left center, anti-aliased', rect, white, 'left', 'center', True) rect.top += 75 pygame.display.update() if QUIT in [event.type for event in pygame.event.get()]: doQuit = True pygame.quit() if __name__ == '__main__': # Execute the demo code if this file is run directly from the command line. # Do not run demo if file is imported. RunDemo()