Die Anwendung einer gemeinsamen Schrift Schema auf mehrere Objekte in wxPython
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?
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