Building a wxPython Application

wxPython Getting Started のサンプルを引き続き。訳は適当です。よく分からないところは飛ばしてます。

wxPython アプリを作ろう

wxPython の将来性(?)と使いやすさが良く分かるように、小さなエディタを作ります。

概要

wxPython においては wxWindow はいわゆるウィンドウではなくて画面上に表示されるさまざまなものを表します。 wxWindow は全ての GUI 部品に共通の振る舞いを定義します。いわゆるウィンドウのクラスを探すならば、変わりに wxFrame を見てください。

サンプル

まずは hello world アプリにテキスト編集コンポーネントを追加します。 見ての通り少しも難しくありません。

#!/usr/bin/env python
import wx
# やる事と言えば wxFrame を継承して、
class MainWindow(wx.Frame):
    """ We simply derive a new class of Frame. """
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(200,100))
        # テキスト編集コントロールの wx.TextCtrl を宣言するように
        #  __init__ メソッドをオーバーライドするだけです。
        self.control = wx.TextCtrl(self, 1, style=wx.TE_MULTILINE)
        # (このサンプルではこれ以降、__init__ メソッド内で自分自身の
        #  表示メソッドを呼び出すようにします。)
        self.Show(True)
app = wx.PySimpleApp()
frame=MainWindow(None, wx.ID_ANY, 'Small editor')
app.MainLoop()

※ちなみに self.control に wx.TextCtrl を保持しておかないと当然のごとくインスタンスは失われ、表示されるウィンドウ(フレームというべきか)にテキスト編集コントロールは表示されません。

メニューを追加

大抵のアプリにはメニューバーとステータスバーがあるので、我々のエディタにも追加してみましょう。

import wx
ID_ABOUT=101
ID_EXIT=110
class MainWindow(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,wx.ID_ANY, title, size = (200,100))
        self.control = wx.TextCtrl(self, 1, style=wx.TE_MULTILINE)
        self.CreateStatusBar() # A Statusbar in the bottom of the window
                               # ウィンドウの下部にステータスバーが追加されます。
        # Setting up the menu.
        # メニューのセットアップです。
        filemenu= wx.Menu()
        # ※メニューアイテムを追加しています。第3引数はメニューアイテムをポイントしたときに
        #   ステータスバーに表示されるテキストです。
        filemenu.Append(ID_ABOUT, "&About"," Information about this program")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT,"E&xit"," Terminate the program")
        # Creating the menubar.
        # メニューバーを作成します。
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.
        self.Show(True)
app = wx.PySimpleApp()
# ※なぜか ID 指定が wx.ID_ANY からマジックナンバーの -1 になってます。
#   (wx.ID_ANY の値は -1 ですが。)
frame = MainWindow(None, -1, "Sample editor")
app.MainLoop()

唯一の問題点は、メニューが表示されるだけだということです。このメニューは何の反応もしません。早速動作を実装してみましょう。