2

私の名前はファビオです。あなたのコミュニティに会えて本当にうれしいです! wxPython、PIL、および fontconfig でフォントを使用する際に問題が発生しました。最初は、PIL を使用してテキストを tiff 画像に書き込みたいと考え、ImageFont.truetype を使用してフォントを変数にロードしました。私が知っているように、truetype メソッドには ttf フォントへのフル パスが必要です。

私はハードコーディングが好きではないので、wx.FontDialog クラスを使用して、ユーザーがフォントを選択できるようにし、フォントパスを単純なバイナリ ファイルに保存しました。問題は、FontDialog.GetFontData() メソッドがフォント パスではなく、単にフォント フェイスを返すことです。

解決策は fontconfig モジュールのようです。fontface を使用すると、fontconfig.query メソッドは必要なものをほぼ正確に返します。つまり、フォントの完全なパスを含むリストを意味します。次に、別の問題が発生します。リストで 1 つのパスを選択する必要があるため、正しいフォントの太さとスタイルを選択して、リストをフィルター処理したいと考えています。

FontDialog によって返されるプロパティは非常に紛らわしいようです。たとえば、wxnormalは "Normal"、"Regular"、"Medium"、"Book"、"Roman"、"Condensed"、"Linemorph"、"Gothic" を意味することがわかりました。 、wxboldは、「ボールド」、「デミボールド」、「デミ」、「ヘビー」に使用できます。適切なフィルターを設定するのは難しく、2 つのクラス間の定数も完全に異なります。

要約すると、これらの手順に従って結果を取得したいと思います。

  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