Python wxPython: wx.Font でGUIの文字フォントを自由に変更する方法

Python

PythonでGUIアプリケーションを作成できるライブラリ wxPython。アプリケーションの機能が完成しても、文字が小さすぎて読みづらかったり、デザインが素っ気なく感じたりすることはありませんか?

GUIアプリケーションにおいて、フォントは「読みやすさ(可読性)」や「デザイン性」を左右する非常に重要な要素です。デフォルトのフォントのままでは、ユーザーに意図が伝わりにくいこともあります。重要なラベルは大きく太字に、補足説明は少し小さく、といった調整がしたくなるはずです。

この記事では、wxPythonで「フォント情報」を専門に扱う wx.Font クラスの基本的な使い方と、それを使ってコントロール(ウィジェット)の文字フォントを変更する具体的な方法を、初心者の方にも分かりやすく解説します。

この記事を読み終える頃には、wx.Font の使い方をマスターし、SetFont メソッドを使って、あなたのGUIアプリの文字サイズやスタイル(太字など)を自由にカスタマイズできるようになっているはずです。

wx.Fontとは?

まずは、wx.Font がどのような役割を持つクラスなのかを理解しましょう。

wxPythonにおける「フォント情報」の基本クラス

wx.Font とは、その名の通り、**wxPythonで「フォント」に関する情報をひとまとめに扱うための専用のクラス(型)**です。

wx.Colour が「色」の情報を扱っていたのに対し、wx.Font はテキスト(文字)の「見た目」に関する情報をすべて保持します。

具体的には、以下のような情報をカプセル化(ひとまとめに)しています。

  • フォントサイズ(例: 12ポイント、18ポイントなど)
  • フォントファミリー(書体の系統、例:ゴシック系、明朝系、等幅など)
  • フォントスタイル(例:標準、イタリック(斜体))
  • フォントウェイト(太さ、例:標準、太字(Bold)、細字(Light))
  • フォントフェイス名(具体的なフォント名、例:”Arial”, “メイリオ”, “Yu Gothic UI”など)

wx.StaticText (ラベル) や wx.Button (ボタン) など、テキストを表示するウィジェットの見た目を変更したい場合に、まずこの wx.Font オブジェクトを「希望のフォント設定」として作成し、それをウィジェットに渡す、という流れになります。

wx.Font オブジェクトの基本的な作成方法

フォントを変更するには、まず「どのようなフォントにしたいか」を定義した wx.Font オブジェクトを作成する必要があります。 wxPythonのバージョン(特に4.x以降)では、フォントの作成方法がいくつかありますが、ここでは代表的な方法を紹介します。

方法1: wx.FontInfo を使ったモダンな作成方法(推奨)

現在のwxPythonで最も推奨される、モダンで可読性の高い方法wx.FontInfo ヘルパークラスを使う方法です。

wx.FontInfo は、wx.Font を作成するため設定情報を一時的に保持するクラスです。wx.FontInfo(ポイントサイズ) で基本サイズを指定した後、.Bold().Italic().FaceName("フォント名") のように、メソッドチェーン. で繋げて連続で呼び出す記法)を使って直感的に設定を追加できます。

最後に、設定済みの wx.FontInfo オブジェクトを wx.Font のコンストラクタに渡すことで、目的の wx.Font オブジェクトが完成します。

import wx

# --- wx.FontInfo を使った作成例 ---

# 1. まず wx.FontInfo で基本設定(ここではサイズ 16pt)
font_info_base = wx.FontInfo(16)

# 2. メソッドチェーンで設定を追加
#    16pt, 太字(Bold), フォント名を "Arial" に指定
font_info_bold_arial = wx.FontInfo(16).Bold().FaceName("Arial")

# 3. wx.FontInfo オブジェクトを wx.Font のコンストラクタに渡す
big_bold_font = wx.Font(font_info_bold_arial)

# 18pt, イタリック(Italic)
italic_font = wx.Font(wx.FontInfo(18).Italic())

# 10pt, 細字(Light)
light_font = wx.Font(wx.FontInfo(10).Light())

このように、wx.FontInfo(16).Bold() という記述だけで「16ポイントの太字」という意図が明確に伝わるため、コードが非常に読みやすくなります。

方法2: wx.Font コンストラクタ(従来の方法)

もちろん、wx.Font のコンストラクタに直接、全ての情報を引数として渡す従来の方法も利用可能です。

wx.Font(pointSize, family, style, weight, underline=False, faceName="", encoding=wx.FONTENCODING_DEFAULT)

引数が多く、family(フォントファミリー)や style(スタイル)、weight(太さ)には、wx.FONTFAMILY_DEFAULTwx.FONTSTYLE_ITALICwx.FONTWEIGHT_BOLD といった「定数」を指定する必要があります。

import wx

# 12pt, SWISS(ゴシック系), イタリック, 標準の太さ
font_traditional = wx.Font(
    12, 
    wx.FONTFAMILY_SWISS, 
    wx.FONTSTYLE_ITALIC, 
    wx.FONTWEIGHT_NORMAL
)

# 16pt, DEFAULT(OS標準), 標準スタイル, 太字(Bold)
font_bold_traditional = wx.Font(
    16,
    wx.FONTFAMILY_DEFAULT,
    wx.FONTSTYLE_NORMAL,
    wx.FONTWEIGHT_BOLD
)

wx.FontInfo を使う方法と比べて、どの引数がどの設定に対応するのかが分かりにくく、記述も長くなりがちです。特別な理由がない限りは、方法1の wx.FontInfo を使うことをお勧めします。

方法3: 既存のフォントをベースに変更する

システムの標準フォントや、すでにウィジェットに設定されているフォントを取得し、それをベースに一部の属性だけを変更する方法もあります。

import wx

# システムの標準GUIフォントを取得
default_font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)

# ポイントサイズだけ 14 に変更
default_font.SetPointSize(14)

# 太字に設定
default_font.SetWeight(wx.FONTWEIGHT_BOLD)

# これで default_font は「標準フォントの14pt・太字」になった

SetPointSize(size)SetWeight(weight) などのメソッドを使って、既存の wx.Font オブジェクトを直接変更できます。

GUIのフォントを変更する (SetFont)

希望の wx.Font オブジェクトが作成できたら、いよいよそれをGUIのウィジェットに適用します。

SetFont メソッドの基本

wx.StaticText (ラベル)、wx.Button (ボタン)、wx.TextCtrl (テキスト入力欄) など、テキスト(文字)を持つほとんどのウィジェットは SetFont メソッドを持っています。

使い方は非常にシンプルで、引数に作成した wx.Font オブジェクトを渡すだけです。

widget.SetFont(font_object)

この SetFont メソッドを呼び出すと、そのウィジェットの表示フォントが即座に変更されます。

wx.StaticText (ラベル) のフォントを変更する例

ウィンドウ内のラベル(説明文)の文字を大きく、太字にしてみましょう。

import wx
# ... (Panel上に StaticText を配置) ...

label = wx.StaticText(panel, label="これは重要なメッセージです")

# 18ptの太字フォントを作成 (wx.FontInfoを使用)
# Family(wx.FONTFAMILY_SWISS) はゴシック系(サンセリフ)を指定
big_bold_font = wx.Font(wx.FontInfo(18).Bold().Family(wx.FONTFAMILY_SWISS))

# 作成したフォントをラベルに適用
label.SetFont(big_bold_font)

これにより、label に表示されるテキストが「18ptの太字」で表示されるようになります。

wx.Button (ボタン) のフォントを変更する例

ボタンのラベル文字も同様に変更できます。OSや環境によってフォントが変わるのを防ぐために、具体的なフォント名(フェイス名)を指定する例です。

import wx
# ... (Panel上に Button を配置) ...

button = wx.Button(panel, label="実行 (Enter)")

# 12pt, フォント名を "Meiryo UI" (Windowsでよく使われる) に指定
# FaceName が見つからない場合は、似たフォントが自動で選ばれます
button_font = wx.Font(wx.FontInfo(12).FaceName("Meiryo UI"))

# 作成したフォントをボタンに適用
button.SetFont(button_font)

このように、ウィジェットごとに異なるフォントを自由に設定できます。

フォント指定の主要なパラメータ(定数)

wx.FontInfo のメソッドや wx.Font のコンストラクタでフォントの系統(ファミリー)や太さ(ウェイト)を指定する際、よく使う代表的な定数(wx. から始まる大文字の名前)を整理します。

フォントファミリー (wx.FONTFAMILY_...)

フォントの「系統」を指定します。FaceName で具体的なフォント名を指定しない場合、OSがこの系統に属する代表的なフォントを選んでくれます。

  • wx.FONTFAMILY_DEFAULT: OSのデフォルト(通常はこれを選んでおけば無難です)。
  • wx.FONTFAMILY_SWISS: サンセリフ体(”MS Pゴシック”, “Arial”, “Helvetica” など)。線の端に「飾り」がない、スッキリした書体です。
  • wx.FONTFAMILY_ROMAN: セリフ体(”MS P明朝”, “Times New Roman” など)。線の端に「飾り」がある書体で、長文に適しているとされます。
  • wx.FONTFAMILY_MODERN: 等幅フォント(”MS ゴシック”, “Courier New” など)。プログラムコードのように、すべての文字が同じ幅で表示されます。

フォントウェイト(太さ) (wx.FONTWEIGHT_...)

文字の太さを指定します。

  • wx.FONTWEIGHT_NORMAL: 標準の太さ。
  • wx.FONTWEIGHT_BOLD: 太字
  • wx.FONTWEIGHT_LIGHT: 細字(対応しているフォントのみ)。

wx.FontInfo を使う場合は、.Bold().Light() メソッドを呼び出す方が直感的です。

フォントスタイル (wx.FONTSTYLE_...)

文字の傾きなどを指定します。

  • wx.FONTSTYLE_NORMAL: 標準(傾きなし)。
  • wx.FONTSTYLE_ITALIC: イタリック(斜体)。
  • wx.FONTSTYLE_SLANT: スラント(イタリックとは異なる機械的な斜体)。

wx.FontInfo を使う場合は、.Italic().Slant() メソッドを使います。

実践コード:フォントを実際に変更する

これまでの内容を総まとめにした、動作するシンプルなサンプルコードです。 wx.FontInfo を使って様々なフォントを作成し、wx.StaticText (ラベル) や wx.ButtonSetFont で適用しています。

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__(None, title="wx.Font テスト")

        panel = wx.Panel(self)
        
        # パネルの背景色を少し変えて見やすく
        panel.SetBackgroundColour(wx.Colour(245, 245, 245))

        # --- 1. デフォルトフォントのラベル ---
        label_default = wx.StaticText(panel, label="1. デフォルトのフォントです。")

        # --- 2. 大きく・太字のフォント ---
        label_big_bold = wx.StaticText(panel, label="2. 大きく太字(18pt, Bold, SWISS)")
        
        # wx.FontInfo を使って 18pt, 太字, ゴシック系(SWISS) を指定
        font_big_bold = wx.Font(wx.FontInfo(18).Bold().Family(wx.FONTFAMILY_SWISS))
        
        # ラベルに適用
        label_big_bold.SetFont(font_big_bold)

        # --- 3. イタリック・明朝系のフォント ---
        label_italic_roman = wx.StaticText(panel, label="3. イタリック・明朝系(12pt, Italic, ROMAN)")
        
        # 12pt, イタリック, 明朝系(ROMAN) を指定
        font_italic_roman = wx.Font(wx.FontInfo(12).Italic().Family(wx.FONTFAMILY_ROMAN))
        
        # ラベルに適用
        label_italic_roman.SetFont(font_italic_roman)

        # --- 4. ボタンのフォント変更 ---
        button = wx.Button(panel, label="フォント変更済みボタン")
        
        # 14pt, 太字, フォント名 "Yu Gothic UI" を指定 (Windowsの場合)
        # "Yu Gothic UI" がなければ、OSが選んだ 14pt 太字フォントになる
        font_button = wx.Font(wx.FontInfo(14).Bold().FaceName("Yu Gothic UI"))
        
        # ボタンに適用
        button.SetFont(font_button)

        # --- Sizer でレイアウト ---
        sizer = wx.BoxSizer(wx.VERTICAL)
        # 各要素にマージン(20px)を追加
        sizer.Add(label_default, 0, wx.ALL, 20)
        sizer.Add(label_big_bold, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 20)
        sizer.Add(label_italic_roman, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM, 20)
        sizer.Add(button, 0, wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, 20)
        
        panel.SetSizer(sizer)

        self.SetSize((500, 400))
        self.Centre()

# アプリケーション実行
if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame()
    frame.Show()
    app.MainLoop()

このコードを実行すると、4つの異なるフォント設定が適用されたウィジェットがウィンドウに表示されるはずです。

まとめ

今回は、wxPythonでGUIの「フォント」を扱うための wx.Font クラスについて、その作成方法と適用方法を詳しく解説しました。

  • wxPythonでフォント情報は wx.Font クラスで扱います。
  • wx.Font は「サイズ」「ファミリー(系統)」「スタイル(斜体など)」「ウェイト(太さ)」「フェイス名(フォント名)」といった情報を保持します。
  • wx.Font の作成は、wx.FontInfo(pointSize).Bold().FaceName(...) のようにメソッドチェーンで直感的に設定できる方法がモダンで推奨されます。
  • 作成したフォントは、wx.StaticTextwx.Button などの widget.SetFont(font_obj) メソッドを使ってウィジェットに適用します。
  • wx.FONTFAMILY_SWISS (ゴシック系) や wx.FONTWEIGHT_BOLD (太字) といった定数を活用することで、環境に依存しにくいフォント指定が可能になります。

テキストの読みやすさは、アプリケーション全体の使いやすさに直結します。wx.Font を適切に設定し、ユーザーにとって読みやすく、デザイン性の高いGUIアプリケーションを目指しましょう。

コメント

タイトルとURLをコピーしました