Применение общей схемы шрифта к нескольким объектам в wxPython

StackOverflow https://stackoverflow.com/questions/171694

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

text = f(wx.StaticText)

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

Если все виджеты уже созданы, вы можете применить 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)

Решение, данное выше @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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top