我的名字是法比奥,我很高兴认识你的社区! 我遇到了使用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"。设置一个好的过滤器很困难,两个类之间的常量也完全不同。
总结我想按照这些步骤来获得我的结果:
字体的Chioce通过FontDialog,GetFontData()menthod。
通过fontconfig.query()方法检索字体的路径列表。
过滤与用户选择的字体完全匹配的路径,包括大小,重量和样式。
返回Imagefont.truetype方法的字体路径。
如下所示你可以阅读我写的一个简短的例子来更好地解释我的意思。它解决了第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()