IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

wx.Font et PIL


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Par défaut wx.Font et PIL
    Bonjour à tous !

    Décidément, les muses du code ne sont pas avec moi ou les développeurs de librairies se sont passés le mot pour me compliquer la vie...

    J'utilise wx pour afficher du texte avec une police choisie par l'utilisateur. Pour ce faire, la police est sélectionnée dans un liste représentant les fonts installées sur le pc. Jusqu'ici tout va bien. Pour charger la font, je spécifie son "facename" puisque wx ne semble pas donner d'autres moyens que de charger un fichier à l'aide de son facename.

    Ailleurs dans mon programme, j'utilise PIL pour créer une image à partir du texte affiché (le texte est sauvé sous forme d'image). Et là, ça ne va plus du tout ^^ : PIL demande qu'on lui fournisse le nom du fichier et pas le "facename". Ici aussi, aucun moyen de charger autrement la police, ou ça m'a échappé.

    Mon soucis est le suivant : comment puis-je établir une correspondance entre un fichier ttf et le facename qui lui est associé ? Autrement dit, comment puis-je m'assurer que les caractères utilisés pour fabriquer l'image sont de la même police que ceux utilisés pour l'affichage dans mon programme ?

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonsoir,

    pourrais-tu poster un extrait fonctionel de ton code pour permettre aux contributeurs d'avoir une base de reflexion?

    merci

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Par défaut
    Bien entendu !

    Je pensais le problème suffisamment général pour être exposé sans exemple, mais je me rends compte que ce n'est pas forcément super clair. Je joins donc un peu de code écrit spécialement pour cibler mon soucis (et pourquoi pas le votre un jour ).

    Il y a pas mal de lignes aussi je suggère d'aller directement lire les commentaires qui donnent des indications sur ce qui me coince...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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()

Discussions similaires

  1. Changer la couleur de "font" dans un objet de type "ImageFont" dans PIL
    Par KINENVEU dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 07/06/2007, 03h29
  2. [SWING][FONT] choisir la police par défaut
    Par narmataru dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 21/02/2003, 10h35
  3. [Technique] Index, comment font les moteurs de recherche ?
    Par bat dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 25/10/2002, 15h41
  4. comment changer d'attribut de fonte dans un Tlabel?
    Par sb dans le forum Composants VCL
    Réponses: 3
    Dernier message: 21/08/2002, 16h53
  5. TextOut : comment changer de font
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 15/07/2002, 20h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo