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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top