Применение общей схемы шрифта к нескольким объектам в wxPython - PullRequest
3 голосов
/ 05 октября 2008

Много раз я буду использовать одну и ту же схему шрифта для статического текста в приложении wxPython. В настоящее время я делаю вызов SetFont() для каждого статического текстового объекта, но это кажется большой ненужной работой. Однако, демонстрация wxPython и книга wxPython In Action не обсуждают это.

Есть ли способ легко применить один и тот же метод SetFont() ко всем этим текстовым объектам, не делая каждый раз отдельных вызовов?

Ответы [ 4 ]

5 голосов
/ 08 октября 2008

Вы можете сделать это, вызвав SetFont в родительском окне (Frame, Dialog и т. Д.) Перед добавлением любых виджетов. Дочерние виджеты будут наследовать шрифт.

1 голос
/ 05 октября 2008

Может быть, попробуйте создать подкласс для текстового объекта, и в вашем классе __init__ метод просто вызовет SetFont ()?

Или сделать что-то вроде:

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

, а затем просто украсьте каждый текстовый объект, с помощью которого вы создаете:

text = f(wx.StaticText)

(конечно, если конструктору StaticText требуются некоторые параметры, потребуется изменить первые строки в f определении функции).

0 голосов
/ 01 февраля 2019

Решение, данное выше @DzinX, сработало для меня при динамическом изменении шрифта в Panel, которая уже имела дочерние элементы и уже показывалась.

В итоге я изменил его следующим образом, потому что оригинал доставил мне неприятности в угловых случаях (то есть при использовании AuiManager с плавающими кадрами).

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
0 голосов
/ 08 октября 2008

Если все виджеты уже созданы, вы можете применить SetFont рекурсивно, например, с помощью следующей функции:

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)

Пример использования, при котором весь текст в frame становится шрифтом по умолчанию с курсивом:

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