wxPythonで複数のオブジェクトに共通のフォントスキームを適用する

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

  •  05-07-2019
  •  | 
  •  

質問

多くの場合、wxPythonアプリケーションの静的テキストに同じフォントスキームを使用します。現在、各静的テキストオブジェクトに対して SetFont()呼び出しを行っていますが、これは多くの不要な作業のようです。ただし、wxPythonデモおよびwxPython In Actionブックではこれについて説明していません。

毎回個別に呼び出すことなく、これらすべてのテキストオブジェクトに同じ 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