很多时候,我会在 wxPython 应用程序中对静态文本使用相同的字体方案。目前我正在SetFont()
调用每个静态文本对象,但这似乎是很多不必要的工作。但是,wxPython 演示和 wxPython In Action 书中没有讨论这个问题。
有没有一种方法可以轻松地将相同的SetFont()
方法应用于所有这些文本对象,而无需每次都单独调用?
您可以通过在添加任何小部件之前在父窗口(框架、对话框等)上调用 SetFont 来完成此操作。子小部件将继承字体。
也许尝试子类化文本对象并在您的类__init__
方法中调用 SetFont()?
或者,执行以下操作:
def f(C):
x = C()
x.SetFont(font) # where font is defined somewhere else
return x
然后用它装饰你创建的每个文本对象:
text = f(wx.StaticText)
(当然,如果StaticText
构造函数需要一些参数,则需要更改f
函数定义中的第一行)。
如果所有小部件都已创建,您可以SetFont
递归应用,例如使用以下函数:
def changeFontInChildren(win, font):
'''
Set font in given window and all its descendants.
@type win: L{wx.Window}
@type font: L{wx.Font}
'''
try:
win.SetFont(font)
except:
pass # don't require all objects to support SetFont
for child in win.GetChildren():
changeFontInChildren(child, font)
一个示例用法,它导致所有文本frame
成为斜体样式的默认字体:
newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)
@DzinX 上面给出的解决方案在我已经有孩子并且已经显示的面板中动态更改字体时对我有用。
我最终对其进行了如下修改,因为原件在极端情况下给我带来了麻烦(即,当使用AuiManager
浮动框架时)。
def change_font_in_children(win, font):
'''
Set font in given window and all its descendants.
@type win: L{wx.Window}
@type font: L{wx.Font}
'''
for child in win.GetChildren():
change_font_in_children(child, font)
try:
win.SetFont(font)
win.Update()
except:
pass # don't require all objects to support SetFont