【Python】GUIアプリを作ってみる【wxPython編】※初心者向け


管理人
pythonのGUIライブラリ、
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サイト

  1. 公式Webサイト
  2. wxPythonで作成されたアプリケーション例

データ処理・分析、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を作成することが記載されています。
  • メイン処理
管理人
これがwxPythonの型です!
是非、活用してください。

 

■参考にさせていただいたサイト

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)

実行結果

初期表示

ボタン押下時

piyo
沢山のウィジェットがありますね!

 

管理人
是非、Widgetに処理を追加して、オリジナルアプリを作ってください。
今回はここまでです。

 

まとめ

wxPythonを使って簡単なGUIアプリを作ることができました。

初心者でも実装ができたと思います。

 

サンプルプログラム2では、ウィジェットが沢山あることが分かりました!

wxPythonには、ウィジェット以外にもファイル管理や通信などの機能があるので、次にためしてみたいと思います。

 

 

管理人
最後までご覧いただきありがとうございました!