Skip to content

Instantly share code, notes, and snippets.

@jasharpe
Created August 22, 2011 16:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jasharpe/1162771 to your computer and use it in GitHub Desktop.
Save jasharpe/1162771 to your computer and use it in GitHub Desktop.
Patch fixing pygame Sysfont infinite loop
diff -r fe49604b5709 lib/sysfont.py
--- a/lib/sysfont.py Fri Aug 19 18:14:22 2011 -0700
+++ b/lib/sysfont.py Mon Aug 22 12:05:57 2011 -0400
@@ -581,14 +581,25 @@
if not styles:
styles = Sysalias.get(name)
if styles:
- while not fontname:
- plainname = styles.get((False, False))
- fontname = styles.get((bold, italic))
- if not fontname:
- fontname = plainname
- elif plainname != fontname:
- gotbold = bold
- gotitalic = italic
+ plainname = styles.get((False, False))
+ fontname = styles.get((bold, italic))
+ if not fontname and not plainname:
+ # Neither requested style, nor plain font exists, so
+ # return a font with the name requested, but an
+ # arbitrary style.
+ (style, fontname) = list(styles.items())[0]
+ # Attempt to style it as requested. This can't
+ # unbold or unitalicize anything, but it can
+ # fake bold and/or fake italicize.
+ if bold and style[0]:
+ gotbold = True
+ if italic and style[1]:
+ gotitalic = True
+ elif not fontname:
+ fontname = plainname
+ elif plainname != fontname:
+ gotbold = bold
+ gotitalic = italic
if fontname: break
set_bold = set_italic = False
import pygame, time
class FontTester:
def __init__(self):
self.i = 0
self.fonts = sorted(pygame.font.get_fonts())
def done(self):
if self.i >= 4 * len(self.fonts):
return True
def get_font_tuple(self):
font = self.fonts[self.i / 4]
bold = (self.i % 4) == 1 or (self.i % 4) == 3
italic = (self.i % 4) == 2 or (self.i % 4) == 3
return (font, bold, italic)
def update(self, events):
for event in events:
if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
self.i = (self.i + 1) % (4 * len(self.fonts))
elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
self.i = (self.i - 1) % (4 * len(self.fonts))
def draw(self, screen):
(font, bold, italic) = self.get_font_tuple()
sysfont = pygame.font.SysFont(font, 30, bold, italic)
text = sysfont.render("font '%s'" % (font), 1, (255, 255, 255))
text_pos = text.get_rect(center = (400, 250))
screen.blit(text, text_pos)
text = sysfont.render("bold: %s" % (bold), 1, (255, 255, 255))
text_pos.top += text.get_height()
screen.blit(text, text_pos)
text = sysfont.render("italic: %s" % (italic), 1, (255, 255, 255))
text_pos.top += text.get_height()
screen.blit(text, text_pos)
if __name__ == "__main__":
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('sysfont test')
font_tester = FontTester()
clock = pygame.time.Clock()
exit_program = False
while not exit_program:
clock.tick(60)
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
exit_program = True
font_tester.update(events)
screen.fill((0, 0, 0))
font_tester.draw(screen)
pygame.display.flip()
pygame.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment