1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| # -*- coding:latin-1 -*-
from PIL import Image, ImageDraw, ImageFont
from wx import wx
from wx.lib.wordwrap import wordwrap
class FontMonospace(wx.FontEnumerator):
"""
Construit une liste de font monospace.
Surcharge de FontEnumerator pour pouvoir utiliser fixedWidthOnly = True
"""
def __init__(self):
wx.FontEnumerator.__init__(self)
self.liste = []
def OnFacename(self, fontname):
self.liste.append(fontname)
class Fenetre(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, 'wx.Font et PIL', (400, 100), (400, 300))
self.fenetre = wx.Panel(self, size=(-1, -1)) # Panneau global de la fenêtre
self.texte = u"Je n'ai pas échoué, j'ai trouvé 10000 moyens qui ne fonctionnent pas."
# Affichage du texte (TextCtrl)
self.ascii = wx.TextCtrl(self.fenetre, -1, self.texte, size=(400, 150), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
self.police = 'Courier New'
# Construire une liste de fonts avec wx.
# La liste que j'obtiens contient le facename de la police de caractère... mais pas d'indications sur le fichier .ttf utilisé.
fm = FontMonospace()
fm.EnumerateFacenames(wx.FONTENCODING_SYSTEM , fixedWidthOnly = True)
fm.liste.sort()
print "Fonts: "
for font in fm.liste:
print "Facename: " + font
# Afficher la liste pour sélectionner une police.
self.nomFont = wx.ListBox(self.fenetre, -1, (-1, -1), (-1, 100), fm.liste, wx.LB_SINGLE)
self.Bind(wx.EVT_LISTBOX, self.eSauverImage, id=self.nomFont.GetId())
# Appliquer la font sur le texte (initialisation)
font = wx.Font(12, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL , False, faceName=self.police)
self.ascii.SetFont(font)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.ascii, 0, wx.EXPAND)
sizer.Add(self.nomFont, 0, wx.EXPAND)
self.fenetre.SetSizer(sizer)
self.SetFocus()
def eSauverImage (self, event):
"""
Sauver le texte sur une image.
"""
# Récupérer le facename de la police.
# Je ne trouve pas comment obtenir le nom du fichier de la police correspondant à ce facename.
face = self.nomFont.GetStringSelection()
# Créer une image avec PIL et écrire le texte dessus
# Je souhaite utiliser la police sélectionée. Le problème c'est que je ne connais que son facename, pas le nom du fichier.
# Je ne trouve pas comment utiliser une police avec PIL autrement qu'en lui spécifiant un fichier .ttf
font = ImageFont.truetype("cour.ttf", 12)
img = Image.new('RGB', (500, 50), (255, 255, 255))
car = ImageDraw.Draw(img)
car.text((10, 10), self.texte, font=font, fill=(0, 0, 0) )
img.show()
def eFermerProg(self, event):
self.Close()
class ImgTxt(wx.App):
"""
Classe de l'application.
"""
def OnInit(self):
fen = Fenetre(None)
self.SetTopWindow(fen)
fen.Show(True)
return True
def main():
# Créer l'application et lancer la boucle principale.
app = ImgTxt(redirect=True)
app.MainLoop()
if __name__ == '__main__': main() |
Partager