Frage

Viele Male werde ich das gleiche Schriftart Schema für statischen Text in einer WxPython Anwendung verwenden. Zur Zeit mache ich einen SetFont() Aufruf für jedes statisches Textobjekt, aber das scheint wie eine Menge unnötiger Arbeit. die wxPython-Demo und WxPython In Aktion Buch Allerdings tun dies nicht diskutieren.

Gibt es eine Möglichkeit, leicht die gleiche SetFont() Methode auf alle diese Textobjekte, ohne dass getrennte Anrufe jedes Mal anwenden?

War es hilfreich?

Lösung

Sie können dies tun, indem SetFont auf das übergeordnete Fenster aufrufen (Frame, Dialog, etc.), bevor Sie Widgets hinzufügen. Das Kind-Widgets wird die Schriftart erbt.

Andere Tipps

Vielleicht versuchen das Textobjekt Subklassen und in Ihrer Klasse __init__ Methode nur SetFont () aufrufen?

Oder so etwas wie:

def f(C):
  x = C()
  x.SetFont(font) # where font is defined somewhere else
  return x

und dann dekorieren nur jedes Textobjekt Sie damit erstellen:

text = f(wx.StaticText)

(natürlich, wenn StaticText Konstruktor einige Parameter benötigt, wird es erfordern, um die ersten Zeilen in f Funktionsdefinition zu ändern).

Wenn alle Widgets bereits erstellt haben, können Sie SetFont rekursiv, zum Beispiel mit der folgenden Funktion anwenden:

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)

Ein Beispiel für die Verwendung, die den gesamten Text in frame verursacht Standardschriftart mit kursiv zu werden:

newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)

Die Lösung oben @DzinX gegeben für mich gearbeitet, wenn die Schriftart dynamisch in einem Panel ändern wollen, die bereits Kinder hatten und wurde bereits gezeigt wird.

Ich landete es wie folgt zu ändern, weil die ursprüngliche gab mir Mühe in Eckfällen (das heißt, wenn eine AuiManager mit Floating-Frames verwendet wird).

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top