将常用字体方案应用于wxPython中的多个对象

时间:2008-10-05 08:27:57

标签: python fonts wxpython

很多时候,我会在wxPython应用程序中对静态文本使用相同的字体方案。目前我正在为每个静态文本对象进行SetFont()调用,但这似乎是很多不必要的工作。但是,wxPython演示和wxPython In Action一书中没有讨论过这个问题。

有没有办法轻松地将相同的SetFont()方法应用于所有这些文本对象,而无需每次都进行单独的调用?

4 个答案:

答案 0 :(得分:5)

您可以通过在添加任何窗口小部件之前在父窗口(框架,对话框等)上调用SetFont来完成此操作。子窗口小部件将继承字体。

答案 1 :(得分: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函数定义中的第一行。

答案 2 :(得分: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)

答案 3 :(得分:0)

@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