Application d'un schéma de polices commun à plusieurs objets dans wxPython
Question
Souvent, j'utiliserai le même jeu de polices pour du texte statique dans une application wxPython. Actuellement, je lance un appel SetFont ()
pour chaque objet texte statique, mais cela semble être un travail inutile. Cependant, la démo wxPython et le livre wxPython In Action n'en parlent pas.
Existe-t-il un moyen d'appliquer facilement la même méthode SetFont ()
à tous ces objets texte sans effectuer d'appels séparés à chaque fois?
La solution
Vous pouvez le faire en appelant SetFont dans la fenêtre parente (Cadre, Boîte de dialogue, etc.) avant d’ajouter des widgets. Les widgets enfants hériteront de la police.
Autres conseils
Peut-être essayez-vous de sous-classer l'objet texte et dans votre méthode de classe __ init __
, appelez simplement SetFont ()?
Ou faites quelque chose comme:
def f(C):
x = C()
x.SetFont(font) # where font is defined somewhere else
return x
et ensuite décorer chaque objet texte créé avec:
text = f(wx.StaticText)
(bien sûr, si le constructeur StaticText
nécessite certains paramètres, il faudra modifier les premières lignes de la définition de la fonction f
).
Si tous les widgets ont déjà été créés, vous pouvez appliquer SetFont
de manière récursive, par exemple avec la fonction suivante:
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)
Exemple d'utilisation faisant en sorte que tout le texte du cadre
devienne une police par défaut avec un style italique:
newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)
La solution indiquée ci-dessus par @DzinX a fonctionné pour moi lors du changement dynamique de la police dans un panneau qui avait déjà des enfants et qui était déjà affiché.
J'ai fini par le modifier comme suit, car l'original m'avait posé problème dans certains cas (c'est-à-dire lors de l'utilisation d'un AuiManager
avec des cadres flottants).
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