如何在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
相关产品推荐
相关产品推荐

