wxPythonを試してみました!
wxPythonは、機能が充実しているため、人気のGUIの1つです。
wxPythonを使って、簡単なGUIアプリを作ってみました。
今回は、初心者向けに、基礎の基礎をメインにするため、
- wxPythonの雰囲気
- 基礎的なwxPythonの実装方法
をつかんでいただけたらと思います。
wxPythonの特徴
wxPythonは、wxWidgetsをPythonで使えるようにしたライブラリです。
wxWidgetは、C++で記述されたGUIツールキットです。
Wikipediaによると、、、
単なるウィジェットだけでなく他のOSに移植しやすいように文字列操作やファイル管理、HTTPによる通信を行う機能も用意されている。
他の多くのウィジェット・ツールキットと違い各コンポーネントの描画をOSに行わせているため各々のOSに調和したコンポーネントを表示できる。
さらに、C++で記述されているため高速で、JavaのSwingのように事前にソフトをインストールしなくても利用できる。
「wxWidget」『フリー百科事典 ウィキペディア日本語版』より。
2020年7月6日 (月) 22:30 UTC
URL: https://ja.wikipedia.org/wiki/WxWidgets
特徴をまとめると、
- 機能が豊富
- OSと調和したGUIが作れる
- 高速
といったところでしょうか。
参考Webサイト
データ処理・分析、CAM、電子カルテなど、様々な分野で使われているため、実績のあるライブラリであることが分かります。
ライセンス
wxWindows Library Licenceのようです。
基本的にはLGPLのようですが、いくつか例外の条件があります。
詳細はこちら(公式Webサイト)をご覧ください。
【Python】GUIアプリを作ってみる【wxPython編】
開発環境
- OS Windows 10
- Pythonバージョン 3.7.1
- エディタ VS Code
- ライブラリ wxPython-4.1.0
準備 wxPythonのインストール
pip install wxPython
⇒「Successfully installed~」がでればOK
サンプルプログラム1 Hello World
ソースコード
import wx # メインフレームクラス class SampleFrame(wx.Frame): def __init__(self, parent, ID, title): wx.Frame.__init__(self, parent, title=title, pos=(0, 0), size=(320, 240)) self.__create_widget() self.__do_layout() # Widgetを作成するメソッド def __create_widget(self): # Hello WorldのテキストWidget作成 self.text = wx.StaticText(self, label="Hello World", pos=wx.Point(50, 20)) # レイアウトを設定するメソッド def __do_layout(self): # レイアウトの設定 sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.text) self.SetSizer(sizer) # アプリケーションクラス class SampleApp(wx.App): # wxPythonのアプリケーションクラスの初期化にはOnInitメソッドを使用する def OnInit(self): # フレームのオブジェクト生成 frame = SampleFrame(None, -1, "Sample wxPython") # メインフレームに設定 self.SetTopWindow(frame) # フレームの表示 frame.Show(True) return True if __name__ == '__main__': # アプリケーションオブジェクトの生成 app = SampleApp() # メインループ app.MainLoop()
もっとシンプルな書き方がありますが、より汎用的に使えるようなコードを意識して書きました。
ポイントとしては、
- メインフレームクラス
- __init__メソッドにクラスが生成されたとき処理を書く
- __create_widgetメソッドでウィジェットを作成
- __do_layoutメソッドでウィジェットのレイアウトを定義
- アプリケーションクラス
- OnInitメソッドにクラスが生成された時の処理を書く
※「Appクラスのドキュメント」に、wxWidgetのアプリケーションクラスは
OnInitを作成することが記載されています。
- OnInitメソッドにクラスが生成された時の処理を書く
- メイン処理
是非、活用してください。
■参考にさせていただいたサイト
wxPython GUI tutorial
⇒wxPythonの公式で紹介されているサイトの一つです。
実行結果
無事に、Hello Worldが表示されました!
次は、色々なウィジェットを配置させてみましょう。
サンプルプログラム2
ソースコード
import wx # メインフレームクラス class SampleFrame(wx.Frame): def __init__(self, parent, ID, title): wx.Frame.__init__(self, parent, title=title, pos=(0, 0), size=(320, 500)) self.__create_widget() self.__do_layout() # Widgetを作成するメソッド def __create_widget(self): # テキストWidgetの作成 self.text = wx.StaticText(self, label="wxPython widgets") # テキストボックスWidgetの作成 self.txtCtrl = wx.TextCtrl(self, -1, style=wx.TE_MULTILINE, size=(200, 150) ) # ボタンWidgetの作成および、ボタン押下時のイベントを定義 self.button = wx.Button(self, label="Push Me") self.button.Bind(wx.EVT_BUTTON, self.OnButton) # コンボボックスWidgetの作成 self.combobox = wx.ComboBox(self, choices=["choice A", "choice B", "choice C"], style=wx.CB_READONLY) # チェックボックスWidgetの作成 self.checkbox = wx.CheckBox(self, label='Check Box') # スライダーWidgetの作成 self.slider = wx.Slider(self, minValue=1, maxValue=10, size=(200, -1)) # ラジオボタンWidgetの作成 self.radiobutton1 = wx.RadioButton(self, label='radio A') self.radiobutton2 = wx.RadioButton(self, label='radio B') self.radiobutton3 = wx.RadioButton(self, label='radio C') # プログレスバーWidgetの作成 self.gauge = wx.Gauge(self, size=(250, -1)) # スピンコントロールWidgetの作成 self.spinctrl = wx.SpinCtrl(self) # レイアウトを設定するメソッド def __do_layout(self): # レイアウトの設定 sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.text, flag=wx.ALIGN_LEFT) sizer.Add(self.txtCtrl, flag=wx.ALIGN_CENTER | wx.TOP, border=7) sizer.Add(self.button, flag=wx.ALIGN_CENTER | wx.TOP, border=15) sizer.Add(self.combobox, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.checkbox, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.slider, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.radiobutton1, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.radiobutton2, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.radiobutton3, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.gauge, flag=wx.ALIGN_CENTER | wx.TOP, border=5) sizer.Add(self.spinctrl, flag=wx.ALIGN_CENTER | wx.TOP, border=5) self.SetSizer(sizer) # メッセージボックスを表示するメソッド def OnButton(event, button_label): wx.MessageBox( "Thank you for clicking me.", "Messsage.") # アプリケーションクラス class SampleApp(wx.App): # wxPythonのアプリケーションクラスの初期化にはOnInitメソッドを使用する def OnInit(self): # フレームのオブジェクト生成 frame = SampleFrame(None, -1, "Sample wxPython") # メインフレームに設定 self.SetTopWindow(frame) # フレームの表示 frame.Show(True) return True if __name__ == '__main__': # アプリケーションオブジェクトの生成 app = SampleApp() # メインループ app.MainLoop()
様々なWidgetを配置してみました。
- テキスト
- テキストボックス
- ボタン
- コンボボックス
- チェックボックス
- スライダー
- ラジオボタン
- プログレスバー
- スピンコントロール
ボタンについては、押したときの処理を記載していますが、他は未実装になります。
■参考にさせていただいたサイト
wxPython ebook Widget (ZetCode)
実行結果
初期表示
ボタン押下時
今回はここまでです。
まとめ
wxPythonを使って簡単なGUIアプリを作ることができました。
初心者でも実装ができたと思います。
サンプルプログラム2では、ウィジェットが沢山あることが分かりました!
wxPythonには、ウィジェット以外にもファイル管理や通信などの機能があるので、次にためしてみたいと思います。