Applicazione di uno schema di font comune a più oggetti in wxPython
Domanda
Molte volte userò lo stesso schema di caratteri per il testo statico in un'applicazione wxPython. Attualmente sto effettuando una chiamata SetFont ()
per ogni oggetto di testo statico, ma sembra un sacco di lavoro inutile. Tuttavia, la demo di wxPython e il libro di wxPython In Action non ne parlano.
Esiste un modo per applicare facilmente lo stesso metodo SetFont ()
a tutti questi oggetti di testo senza effettuare chiamate separate ogni volta?
Soluzione
Puoi farlo chiamando SetFont nella finestra principale (Frame, Dialog, ecc.) prima di aggiungere qualsiasi widget. I widget figlio erediteranno il carattere.
Altri suggerimenti
Forse prova a sottoclassare l'oggetto di testo e nel tuo metodo __init__
nella tua classe basta chiamare SetFont ()?
Oppure, fai qualcosa del tipo:
def f(C):
x = C()
x.SetFont(font) # where font is defined somewhere else
return x
e poi decora semplicemente ogni oggetto di testo che crei con esso:
text = f(wx.StaticText)
(ovviamente, se il costruttore StaticText
richiede alcuni parametri, richiederà la modifica delle prime righe nella definizione della funzione f
).
Se tutti i widget sono già stati creati, è possibile applicare SetFont
in modo ricorsivo, ad esempio con la seguente funzione:
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 esempio di utilizzo che fa diventare tutto il testo nel frame
come carattere predefinito con stile corsivo:
newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)
La soluzione data sopra da @DzinX ha funzionato per me quando ho cambiato il carattere dinamicamente in un pannello che aveva già dei figli e che era già mostrato.
Ho finito per modificarlo come segue perché l'originale mi ha dato problemi in casi angolari (cioè quando si utilizza un AuiManager
con frame mobili).
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