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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top