pygame is
Python
Simple DirectMedia Layer
 
 
pygame.org is
Site Swing
Wiki

SimpleFontManager

      
Search:  
 
 

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

 
our projects
pygame.org welcomes all python game, art, music, sound, video and multimedia projects. If they use pygame or not.
 
recent releases
Apr 19, 2014

Apr 16, 2014


Apr 13, 2014

Apr 9, 2014

Mar 18, 2014


Mar 15, 2014


Mar 14, 2014

Mar 13, 2014

Mar 11, 2014

... more!
 
for pygame related questions, comments, and suggestions, please see help (lists, irc)