2

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

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

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

FontDialog 返回的属性似乎很混乱,例如我发现wxnormal可以表示 "Normal","Regular","Medium","Book","Roman","Condensed","Linemorph","Gothic" , wxbold可用于“Bold”、“Demi Bold”、“Demi”、“Heavy”。很难设置一个好的过滤器,两个类之间的常量也完全不同。

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

  1. 通过 FontDialog、GetFontData() 方法选择字体。

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

  3. 过滤与用户选择的字体、大小、粗细和样式完全匹配的路径。

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

如下您可以阅读我写的一个简短示例,以更好地解释我的意思。它解决了第 1 点和第 2 点,但在第 3 点停止。任何建议将不胜感激。

法比奥

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()
4

0 回答 0