Aplicação de um sistema de fonte comum a vários objetos em wxPython
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?
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