문제

여러 번 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top