多くの場合、wxPythonアプリケーションの静的テキストに同じフォントスキームを使用します。現在、SetFont()
静的テキストオブジェクトごとに呼び出しを行っていますが、これは多くの不要な作業のようです。ただし、wxPythonデモとwxPythonInActionの本ではこれについて説明していません。
SetFont()
毎回別々に呼び出すことなく、これらすべてのテキストオブジェクトに同じメソッドを簡単に適用する方法はありますか?
これを行うには、ウィジェットを追加する前に、親ウィンドウ (Frame、Dialog など) で 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