みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

wxPython+wxFormBuilderでGUI

PythonのGUIのおすすめはwxPythonとwxFormBuilderです。wxPythonはwxWidgetをPythonからいじれるようにしたもので、wxFormBuilderはGUIのコードをさくさくっと自動生成してくれるソフトです。

インストール

Ubuntuで開発する場合。

Ubuntu Software CenterでwxPythonを検索、インストール

http://wxformbuilder.org/から最新バージョンをダウンロード、インストール

  • wxformbuilder_3.3.01-0ubuntu1\~lucid1_i386.debが最新(2012.2.12)
  • Software Centerのビルドは3.1で、Pythonコードの生成ができないので不便(2012.2.12)

gtk2-engines-pixbufをインストール

  • sudo apt-get install gtk2-engines-pixbuf をターミナルにて実行
  • (python:4974): Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"というエラーが出ます。

wxFormBuilderの使い方

プロジェクトを作成する

新規のプロジェクトを作成します。ProjectのPropertiesに、name,path,file,code_generationという設定項目があるので、それぞれを適切な値に設定します。Pythonを使う場合は、code_generationのPythonにチェックを入れておきます。

GUIを作成する

Component Paletteが右上部にありますので、ここから追加したいものをクリックすると追加されます。クリックしても追加できない場合は、別のものを追加しましょう。一般的には、FormsのFrameをはじめに追加し、Layoutの趣味なものを追加し、そこにボタンやラベルなどを追加している感じでしょうか。

f:id:atsuhiro-me:20151103003428p:plain:w300

VMGtoEMLのGUIの作成画面です。

イベントを作成する

GUIのコンポーネントにはイベントを登録することができます。というか、これができないとGUIの意味がないのですが。

f:id:atsuhiro-me:20151103003433p:plain:w300

イベントは簡単で、イベントを割り当てたいコンポーネントをクリックして、Eventタブの中にある適切なイベント名の横に呼び出したいメソッド名を追加するだけです。(注意)wxFormBuilderのバージョンが低いと、Pythonコードの書き出しができないので、Eventが使えません。できるだけ最新のものを使用することをおすすめします。みーはこれではまりました。

Pythonコードを書きだす

F8を押します。これだけです。生成されたPythonコードはこのようになると思います。

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Feb  9 2012)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import wx
import wx.xrc

wx.ID_BUTTON_Convert = 1000

###########################################################################
## Class mainFrame
###########################################################################

class mainFrame ( wx.Frame ):
 
    def __init__( self, parent ):
    ...

 
    def __del__( self ):
         pass
 
 
    # Virtual event handlers, overide them in your derived class
    def convert( self, event ):
        event.Skip()

継承クラスを書きだす

F6を押します。これだけです。生成されたPythonコードはこのようになると思います。

"""Subclass of mainFrame, which is generated by wxFormBuilder."""

import wx
import gui

# Implementing mainFrame
class MyProject1mainFrame( gui.mainFrame ):
    def __init__( self, parent ):
    gui.mainFrame.__init__( self, parent )
        self.Show()
 
    # Handlers for mainFrame events.
    def convert( self, event ):
    # TODO: Implement convert
        pass

#TODOの部分に処理を書きます。wxFormBuilderのデフォルトのコードでは、wx.frame.Show()が実行されないので、付け加える必要があります。

wx.Appの継承クラスを作成する

import wx
import MyProject1mainFrame

class MyApp(wx.App):
    def __init__(self, redirect=False, filename=None):
    wx.App.__init__(self, redirect, filename)
    self.frame = MyProject1mainFrame.MyProject1mainFrame(None)

if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

オレンジの部分はそれぞれの場合に適した名前に置き換えてください。参考:http://wiki.wxpython.org/Using%20wxPython%20Demo%20Code

これで完成です。wx.Appの継承クラスを実行すれば、ウインドウが表示されるはずです。

Tips

(python:4974): Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap"とエラーが出る

まず、gtk2-engines-pixbufをインストールし、

sudo apt-get install gtk2-engines-pixbuf

をターミナルにて実行