在wxPython中对多个对象应用统一字体方案

3 投票
4 回答
1636 浏览
提问于 2025-04-11 09:22

很多时候,我在wxPython应用程序中会对静态文本使用相同的字体设置。目前,我对每个静态文本对象都调用一次SetFont(),但这样做感觉工作量太大了。不过,wxPython的示例和《wxPython In Action》这本书里没有提到这个问题。

有没有什么简单的方法,可以一次性把同样的SetFont()设置应用到所有这些文本对象,而不用每次都单独调用呢?

4 个回答

0

如果所有的控件(小部件)已经创建好了,你可以用一个叫 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)
1

也许可以尝试创建一个文本对象的子类,在你的类的 __init__ 方法里直接调用 SetFont()?

或者,可以这样做:

def f(C):
  x = C()
  x.SetFont(font) # where font is defined somewhere else
  return x

然后在你创建的每个文本对象上都加上这个:

text = f(wx.StaticText)

(当然,如果 StaticText 的构造函数需要一些参数,那么就需要修改 f 函数定义的前几行)。

5

你可以在添加任何小部件之前,先在父窗口(比如框架、对话框等)上调用设置字体的命令。这样,所有的子小部件就会自动使用这个字体。

撰写回答