wxPython无法修改字体:设置静态文本字体字号不生效问题
解决wxPython中修改系统字体字号不生效的问题
嘿,我碰到过类似的wxPython字体坑!你这段代码里直接修改从wx.SystemSettings.GetFont拿到的字体对象,有时候会因为系统字体的只读特性白忙活一场——看起来改了字号,但控件根本没用上修改后的字体。
问题根源
wxWidgets返回的系统字体对象在部分平台上是只读副本,直接调用SetPointSize()修改它不会产生实际效果,你改的只是一个临时引用,并没有生成可被控件真正识别的新字体实例。
修复方案
1. 先复制系统字体再修改(最推荐)
核心是先调用Copy()创建字体副本,再修改副本的属性:
panel = wx.Panel(self) # 关键步骤:先复制系统字体,再修改副本 font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT).Copy() font.SetPointSize(20) vbox = wx.BoxSizer(wx.VERTICAL) hbox1 = wx.BoxSizer(wx.HORIZONTAL) class_name_text = wx.StaticText(panel, label='Class name') class_name_text.SetFont(font) # 给控件加个边距,方便看清字号变化 hbox1.Add(class_name_text, flag=wx.ALL, border=8) vbox.Add(hbox1) panel.SetSizer(vbox) # 强制刷新布局,确保控件应用新字体 panel.Layout()
2. 直接构造自定义字体(可选)
如果你不需要严格匹配系统字体的样式,也可以直接创建新字体对象:
# 直接指定字号、字体系列、样式等属性 font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) class_name_text.SetFont(font)
3. 验证字体是否真的被修改
你可以打印相关属性,确认修改是否生效:
print(f"修改后的字体字号: {font.GetPointSize()}") print(f"控件实际使用的字号: {class_name_text.GetFont().GetPointSize()}")
如果打印出来的字号是20,但显示还是12,那只需要调用class_name_text.Refresh()或者panel.Layout()强制刷新控件即可。
内容的提问来源于stack exchange,提问作者Sviatozar Petrenko
相关产品推荐
相关产品推荐

