使用wxFont和fontconfig检索字体路径

时间:2015-04-06 21:30:13

标签: fonts wxpython fontconfig

我的名字是法比奥,我很高兴认识你的社区! 我遇到了使用wxPython,PIL和fontconfig处理字体的问题。一开始我想使用PIL在tiff图像中写入文本,我使用ImageFont.truetype在变量中加载字体。正如我所知,truetype方法需要ttf字体的完整路径。

我不喜欢硬编码,因此我使用wx.FontDialog类让用户选择一种字体,并将fontpath保存在一个简单的二进制文件中。问题是FontDialog.GetFontData()方法只返回Font Face,而不是字体路径。

解决方案似乎是fontconfig模块:使用fontface,fontconfig.query方法几​​乎完全返回我需要的内容,我的意思是带有字体完整路径的列表。然后又出现了另一个问题:我必须在列表中选择一个路径,所以我想过滤列表,选择正确的字体和样式。

FontDialog返回的属性似乎很混乱,例如我发现 wxnormal 可能意味着"正常","常规",&#34 ;中""图书""罗马""冷凝"" Linemorph""哥特" , wxbold 可以用于" Bold"," Demi Bold"," Demi"," Heavy"。设置一个好的过滤器很困难,两个类之间的常量也完全不同。

总结我想按照这些步骤来获得我的结果:

  1. 字体的Chioce通过FontDialog,GetFontData()menthod。

  2. 通过fontconfig.query()方法检索字体的路径列表。

  3. 过滤与用户选择的字体完全匹配的路径,包括大小,重量和样式。

  4. 返回Imagefont.truetype方法的字体路径。

  5. 如下所示你可以阅读我写的一个简短的例子来更好地解释我的意思。它解决了第1点和第2点,但在第3点停止。 任何建议都将深表感谢。

    的Fabio

    import wx
    import fontconfig
    #os.path.join(os.environ['WINDIR'], 'Fonts')
    
    class TF(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, -1, "", size=(800, 500), pos=(400, 400))
            pan = wx.Panel(self, -1)
            self.lbl = wx.TextCtrl(pan, -1, pos=(0,30), size=(750, 210), style=wx.TE_MULTILINE|wx.TE_AUTO_SCROLL)
            self.txt = wx.TextCtrl(pan, -1, pos=(0,240), size=(750, 250), style=wx.TE_MULTILINE|wx.TE_AUTO_SCROLL)
            self.cmdFontDialog = wx.Button(pan, -1, "A", size=(30,30))
            self.Bind(wx.EVT_BUTTON, self.onFontDialog, self.cmdFontDialog)
    
        def propertiesWX(self, fontData):
            strLbl = ""
            strLbl += "-" * 50 + "\n"
            strLbl += fontData.GetChosenFont().GetFaceName() + "\n"
            strLbl += fontData.GetChosenFont().GetFamilyString() + "\n"
            strLbl += str(fontData.GetChosenFont().GetFamily()) + "\n"
            strLbl += fontData.GetChosenFont().GetWeightString() + "\n"
            self.lbl.SetValue(strLbl)
    
        def propertiesFC(self, family):
            lst = fontconfig.query(family=family)
            obj = []
            for f in lst:
                obj.append(fontconfig.FcFont(f))
            strLbl = ""
    
            for font in obj:            
                strLbl += "*" * 50 + "\n"
                strLbl += "FONT FAMILY: " + font.family[0][1] + "\n"
                strLbl += "FONT FILE: " + font.file + "\n"
                strLbl += "FONT FULLNAME: " + font.fullname[0][1] + "\n"
                strLbl += "FONT FORMAT: " + font.fontformat + "\n"
                strLbl += "FONT STYLE: " + font.style[0][1] + "\n"
                strLbl += "FONT WEIGHT: " + str(font.weight) + "\n"
                strLbl += "SLANT: " + str(font.slant) + "\n"
                strLbl += "CAPABILITY: " + font.capability + "\n"
                strLbl += "WIDTH: " + str(font.width) + "\n"
            self.txt.SetValue(strLbl)
    
        def onFontDialog(self, evt):
            dlg = wx.FontDialog(None, wx.FontData())        
            if dlg.ShowModal() == wx.ID_OK:
                fontData = dlg.GetFontData()
                tf.propertiesWX(fontData)
                tf.propertiesFC(fontData.GetChosenFont().GetFaceName())
    
    if __name__ == '__main__':
        app = wx.PySimpleApp()
        tf = TF()
        tf.Show()
        app.MainLoop()
    

0 个答案:

没有答案