You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在wxPython中使用AddPrivateFont修改应用标题栏字体?

在wxPython中使用AddPrivateFont修改应用标题字体的问题

我尝试用AddPrivateFont给wxPython应用的标题设置私有字体,但一直没找到正确方法。参考过相关演示和示例代码,试了几种写法都报错。

尝试过的错误代码及问题

第一段代码

f = wx.Font(
    pointSize=18,
    family=wx.FONTFAMILY_DEFAULT,
    style=wx.FONTSTYLE_NORMAL,
    weight=wx.FONTWEIGHT_NORMAL,
    underline=False,
    faceName="Youth Touch",
    encoding=wx.FONTENCODING_DEFAULT,
)

xwq = self.SetAppName("Custom Gui 1")
xwq.SetFont(f)

运行报错:AttributeError: 'NoneType' object has no attribute 'SetFont'

第二段代码

f = wx.Font(
    pointSize=18,
    family=wx.FONTFAMILY_DEFAULT,
    style=wx.FONTSTYLE_NORMAL,
    weight=wx.FONTWEIGHT_NORMAL,
    underline=False,
    faceName="Youth Touch",
    encoding=wx.FONTENCODING_DEFAULT,
)

frame.SetTitle('yourtitle')
frame.SetFont(f)

同样触发上述AttributeError错误。

完整测试代码

import wx
import wx.grid as grid

import os
import sys

try:
    gFileDir = os.path.dirname(os.path.abspath(__file__))
except:
    gFileDir = os.path.dirname(os.path.abspath(sys.argv[0]))
gDataDir = os.path.join(gFileDir, "myfonts")


filename = os.path.join(gDataDir, "YouthTouchDemoRegular-4VwY.ttf")
wx.Font.AddPrivateFont(filename)


class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title, size=(800, 600))

        f = wx.Font(
            pointSize=12,
            family=wx.FONTFAMILY_DEFAULT,
            style=wx.FONTSTYLE_NORMAL,
            weight=wx.FONTWEIGHT_NORMAL,
            underline=False,
            faceName="Youth Touch DEMO Regular",
            encoding=wx.FONTENCODING_DEFAULT,
        )
        title.SetFont(f)

        self.panel = MyPanel(self)


class MyPanel(wx.Panel):
    def __init__(self, parent):
        super(MyPanel, self).__init__(parent)

        mygrid = grid.Grid(self)
        mygrid.CreateGrid(26, 9)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(mygrid, 1, wx.EXPAND)
        self.SetSizer(sizer)


class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame(parent=None, title="Grid In WxPython")
        self.frame.Show()
        return True


app = MyApp()
app.MainLoop()

可行解决方案

通过调整字体设置逻辑,可正确将私有字体应用到标题栏,以下是验证有效的代码片段:

try:
    gFileDir = os.path.dirname(os.path.abspath(__file__))
except:
    gFileDir = os.path.dirname(os.path.abspath(sys.argv[0]))
gDataDir = os.path.join(gFileDir, "myfonts")

print("gDataDir: ", gDataDir)

filename = os.path.join(gDataDir, "YouthTouchDemoRegular-4VwY.ttf")
wx.Font.AddPrivateFont(filename)

print("filename: ", filename)

self.label_font = self.GetFont()
self.label_font.SetPointSize(18)
self.label_font.SetFamily(wx.FONTFAMILY_DEFAULT)
self.label_font.SetStyle(wx.FONTSTYLE_NORMAL)
self.label_font.SetWeight(wx.FONTWEIGHT_NORMAL)
self.label_font.SetUnderlined(False)
self.label_font.SetFaceName("Youth Touch DEMO")
self.label_font.SetEncoding(wx.FONTENCODING_DEFAULT)
self.SetFont(self.label_font)

关键注意点

  • 先通过wx.Font.AddPrivateFont()加载私有字体文件,确保字体被正确注册到应用中
  • 不要直接给title或SetAppName的返回值调用SetFont,应先获取当前窗口的字体对象,修改属性后再调用SetFont应用
  • faceName必须与字体文件的实际名称完全匹配,否则无法正确加载目标字体

内容的提问来源于stack exchange,提问作者Lod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:40:49