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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top