Применение общей схемы шрифта к нескольким объектам в wxPython
Вопрос
Много раз я буду использовать одну и ту же схему шрифта для статического текста в приложении 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