Aplicar un esquema de fuente común a varios objetos en wxPython
Pregunta
Muchas veces usaré el mismo esquema de fuente para texto estático en una aplicación wxPython. Actualmente estoy haciendo una llamada SetFont ()
para cada objeto de texto estático, pero eso parece mucho trabajo innecesario. Sin embargo, la demostración wxPython y el libro wxPython In Action no discuten esto.
¿Hay alguna manera de aplicar fácilmente el mismo método SetFont ()
a todos estos objetos de texto sin hacer llamadas separadas cada vez?
Solución
Puede hacer esto llamando a SetFont en la ventana principal (Marco, Diálogo, etc.) antes de agregar cualquier widget. Los widgets secundarios heredarán la fuente.
Otros consejos
¿Quizás intente subclasificar el objeto de texto y en su clase __init__
simplemente llame a SetFont ()?
O, haga algo como:
def f(C):
x = C()
x.SetFont(font) # where font is defined somewhere else
return x
y luego simplemente decora cada objeto de texto que creas con él:
text = f(wx.StaticText)
(por supuesto, si el constructor StaticText
requiere algunos parámetros, requerirá cambiar las primeras líneas en la definición de función f
).
Si ya se han creado todos los widgets, puede aplicar SetFont
de forma recursiva, por ejemplo, con la siguiente función:
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)
Un ejemplo de uso que hace que todo el texto en frame
se convierta en fuente predeterminada con estilo en cursiva:
newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)
La solución dada anteriormente por @DzinX funcionó para mí al cambiar la fuente dinámicamente en un Panel que ya tenía hijos y ya se estaba mostrando.
Terminé modificándolo de la siguiente manera porque el original me dio problemas en los casos de esquina (es decir, cuando uso un AuiManager
con marcos flotantes).
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