WXPYTHON의 여러 객체에 공통 글꼴 체계를 적용
문제
여러 번 Wxpython 응용 프로그램에서 정적 텍스트에 동일한 글꼴 체계를 사용합니다. 현재 나는 만들고있다 SetFont()
각 정적 텍스트 객체를 호출하지만 불필요한 작업이 많이 보입니다. 그러나 Action Book의 Wxpython 데모와 Wxpython은 이것에 대해 논의하지 않습니다.
쉽게 동일하게 적용 할 수있는 방법이 있습니까? SetFont()
매번 별도의 호출을하지 않고이 모든 텍스트 객체에 대한 방법?
해결책
위젯을 추가하기 전에 상위 창 (프레임, 대화 상자 등)에서 setfont를 호출하여이를 수행 할 수 있습니다. 어린이 위젯은 글꼴을 상속합니다.
다른 팁
텍스트 객체와 수업에서 서브 클래스를 시도해보십시오. __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가 위에서주는 솔루션은 이미 자녀가 있고 이미 보여지고있는 패널에서 글꼴을 동적으로 변경할 때 저에게 효과적이었습니다.
원본이 코너 케이스에서 문제를 일으켰기 때문에 다음과 같이 수정했습니다. 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