This snippet of code will convert a string of text into a list containing the lines it would break down into for a certain font and width.

from itertools import chain def truncline(text, font, maxwidth): real=len(text) stext=text l=font.size(text)[0] cut=0 a=0 done=1 old = None while l > maxwidth: a=a+1 n=text.rsplit(None, a)[0] if stext == n: cut += 1 stext= n[:-cut] else: stext = n l=font.size(stext)[0] real=len(stext) done=0 return real, done, stext def wrapline(text, font, maxwidth): done=0 wrapped=[] while not done: nl, done, stext=truncline(text, font, maxwidth) wrapped.append(stext.strip()) text=text[nl:] return wrapped def wrap_multi_line(text, font, maxwidth): """ returns text taking new lines into account. """ lines = chain(*(wrapline(line, font, maxwidth) for line in text.splitlines())) return list(lines)

So:
pygame.init() font=pygame.font.Font(None, 17) print wrapline("Now is the time for all good men to come to the aid of their country", font, 120) outputs: ['Now is the time for all', 'good men to come to', 'the aid of their', 'country']

Now actually displaying that text (which you will have to do line by line) is another matter.
But it was easier for me to display the text than to write this code to wrap a line, it really stumped me for a while.

(Update: An obnoxiously long word that rsplit can't break up would previously cause an infinite loop. Added a cutoff to start splitting the word once 'stext' stops changing). What this means from the point of view ? Is necessary to make modifications ?



page migrated to new wiki