Pergunta

Muitas vezes eu vou usar o mesmo esquema de fonte para o texto estático em um aplicativo wxPython. Atualmente estou fazendo uma chamada SetFont() para cada objeto de texto estático, mas que parece ser um monte de trabalho desnecessário. No entanto, a demo wxPython e livro wxPython em ação não discutimos isso.

Existe uma maneira para aplicar facilmente o mesmo método SetFont() a todos estes objetos de texto sem fazer chamadas separadas de cada vez?

Foi útil?

Solução

Você pode fazer isso chamando SetFont na janela pai (Frame, diálogo, etc) antes de adicionar widgets. Os widgets filhos herdarão a fonte.

Outras dicas

Talvez tente subclasse o objeto de texto e em seu método __init__ classe apenas chamar SetFont ()?

Ou, fazer algo como:

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

e depois é só decorar cada objeto de texto que você cria com com ele:

text = f(wx.StaticText)

(claro, se construtor StaticText requer alguns parâmetros, que vai exigir a alteração das primeiras linhas de definição da função f).

Se todos os widgets já foram criados, você pode aplicar SetFont de forma recursiva, por exemplo, com a seguinte função:

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)

Um exemplo de uso que faz com que todo o texto no frame para se tornar fonte padrão com estilo itálico:

newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)

A solução dada acima por @DzinX trabalhou para mim quando mudar a fonte de forma dinâmica em um painel que já tiveram filhos e já estava sendo mostrado.

Acabei modificando-a da seguinte forma porque o original me deu problemas em casos de canto (ou seja, quando se utiliza um AuiManager com quadros flutuantes).

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top