【初心者向け】wxPythonで「Hello World」をして.exe/.app化するまで

プログラミング
この記事は約10分で読めます。

今回はPythonでGUIアプリケーションを作成することが出来る「wxPython」をご紹介します。

今回の目標はwxPythonで「Hello World」を出してそれをアプリケーション化(.exe/.app化)するところまでやります。

初心者向けの内容となりますので、冗長な表現や詳細をカットしている場合がございます。ご了承ください。

それでは、どうぞ!

今回の動作環境は次のとおりです。

ソフト バージョン
Python v3.7.1
wxPython v4.0.4

Pythonのインストール

まずは、Pythonをインストールしましょう。下記の記事を参照してPythonをインストールしてみてください(Macの方向け)。

【初心者向け】anyenvを使ったpyenvのインストール方法
今回はMacでanyenvを使ってpyenvをインストールし、好きなバージョンのPythonをインストールできるようになるまで説明します。この記事は初心者向けですので、細かい説明を省いてる部分があります。ご了承ください。

wxPythonのインストール

次にwxPythonをインストールします。次のコマンドを実行してwxPythonをインストールしましょう。

$ pip install wxPython
Successfully installed Pillow-5.4.1 wxPython-4.0.4

と表示されたら成功です。これで、PythonスクリプトからwxPythonが使えるようになりました

スポンサーリンク

Hello World

さて、wxPythonを使用して「Hello World」を出してみましょう。

ソースコード

次のコードを見てください。

import wx


class MyApp(wx.App):
    def OnInit(self):
        # フレームの用意
        frame = wx.Frame(None, wx.ID_ANY, 'Hello World', size=(400,300))

        # パネルの用意
        panel = wx.Panel(frame, wx.ID_ANY)

        # ラベルの用意
        wx.StaticText(panel, wx.ID_ANY, "Hello World")

        # フレームを表示する
        frame.Show()

        # Trueを返す
        return True

if __name__ == "__main__":
    # アプリケーションを呼び出す
    app = MyApp(0)
    app.MainLoop()

上記のコードの説明をします。

  • 4行目でアプリケーションのメイン部となるクラスを作成しています。
  • 5行目のdef OnInit(self):メインの処理を書いていきます。
  • 7行目ではウィンドウとなるフレームを作成しています。ウィンドウのタイトルは「Hello World」、大きさは400×300です。wx.ID_ANYのところは自分でもID名を指定できますが、特にする必要はないため、wx.ID_ANYを指定しておきます。
  • 10行目ではウィンドウに乗せるパネルを作っています
  • 13行目で「Hello World」のラベルを作成しています。wx.StaticText()がラベルを作成する関数です。
  • 16行目でフレームを表示します。
  • 19行目でTrueを返します。これは必ずやってください。
  • 23行目が最初に呼ばれる処理です。ここで、上記の処理の初期化を行います。
  • 24行目で実際にアプリケーションが実行されます。

実行結果

上記のソースコードを.py形式のファイルで保存してください。そして次のコマンドを入力してください(ファイル名は各自変更)。

$ python helloworld.py

Macの場合は次のコマンドを使用してください。

$ pythonw helloworld.py

実際のアプリケーションが下の画像となります。

発展

これでは少し味気ないので、文字を大きくし、中央寄せして見栄えを良くしてみましょう。

そのプログラムが次のコードとなります。

import wx


class MyApp(wx.App):
    def OnInit(self):
        # フレームの用意
        frame = wx.Frame(None, wx.ID_ANY, 'Hello World', size=(400,300))
        # パネルの用意
        panel = wx.Panel(frame, wx.ID_ANY)
        # Sizerの用意
        main_sizer = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.BoxSizer(wx.HORIZONTAL)

        # ラベルの用意
        text_hello_world = wx.StaticText(panel, wx.ID_ANY, "Hello World")

        # フォントの変更
        font = wx.Font(25, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
        text_hello_world.SetFont(font)

        # ラベルを貼り付け
        sizer.Add(text_hello_world, 0, wx.CENTER)

        # sizerを中央寄せ
        main_sizer.AddStretchSpacer()
        main_sizer.Add(sizer, 0, wx.CENTER)
        main_sizer.AddStretchSpacer()

        # sizerをパネルにセット
        panel.SetSizer(main_sizer)

        # フレームを表示する
        frame.Show()

        # Trueを返す
        return True

if __name__ == "__main__":
    # アプリケーションを呼び出す
    app = MyApp(0)
    app.MainLoop()

さっきのソースコードから追加されたのが、11〜12行目、18〜19行目、22〜30行目です。それぞれ解説して聞きます。

  • 11〜12行目でBoxSizerを用意しています。これは要素を縦方向や横方向へ連続して配置するための部品です。中央寄せをするときにも使用します。画面中央に寄せるには2つのBoxSizerが必要なので2つ用意しています。
  • 15行目に変数を追加しています。
  • 18〜19行目ではラベルのフォントを変更しています。wx.Font()で好きなフォントを用意し、.SetFont()でフォントを適用します。今回は、フォントの大きさを25に変更しています。
  • 22行目ではsizerに対しラベルを追加しています。
  • 25〜27行目で画面中央寄せしています。イメージとしてはmain_sizer.AddStretchSpacer()で上下にスペースを作ってsizerを中央に持ってくるといった感じです。
  • 30行目でパネルにmain_sizerをセットしています。
実行結果

これを実行すると次の画像のようになります。

先程より見栄えが良くなったかと思います。

PyInstallerでアプリケーション化

PyInstallerというソフトを使って先程のスクリプトをアプリケーション(.app/.exe)化してみましょう。

PyInstallerはwxPythonなどで作ったPythonスクリプトをWindowsやMac用の実行ファイルに変換してくれるソフトです。

早速使ってみましょう!

インストール

インストールは次のコマンドで行います。

$ pip install pyinstaller

そうしたら次コマンドを入力してちゃんとインストールされているか確認してください。

$ pyinstaller -v
3.4

specファイルの作成

pyinstallerで実行ファイルを作るためにはspecファイルを作るのが一般的です。specファイルとは以下のようなファイルです。specファイルではPythonが使えます。

# -*- mode: python -*-
import platform
import os
WINDOWS = (platform.system() == "Windows")
LINUX = (platform.system() == "Linux")
MAC = (platform.system() == "Darwin")

EXE_DEST = "HelloWorld" if not WINDOWS else "HelloWorld.exe"
PATHEX = [os.path.dirname(os.path.abspath(SPEC))]
if WINDOWS:
    PATHEX.append('C:\\Program Files (x86)\\Windows Kits\\\Redist\\ucrt\\DLLs\\x86')
    PATHEX.append('C:\\Program Files (x86)\\Windows Kits\\\Redist\\ucrt\\DLLs\\x64')

a = Analysis(['helloworld.py'],
             pathex=PATHEX,
             hiddenimports=[],
             hookspath=None,
             runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=EXE_DEST,
          debug=False,
          strip=None,
          upx=False,
          console=False)
if MAC:
    app = BUNDLE(exe,
                name=EXE_DEST + '.app',
                info_plist={
                'NSHighResolutionCapable': 'True'},
                )

このファイルではWindowsやMacでも動作するように記述しています。詳しい説明はこちらのページに書いてあります。
簡単に上記を説明すると
* 9〜12行目でパスを追加しています。これがないと必要なモジュールが参照できない場合があります。
* 14行目で.pyファイルを解析しています。
* 20行目でexeファイルの作成を行います。オプションは上記サイトで確認。
* 30行目以降はMac向けの処理となります。ここで.appファイルを作成します。NSHighResolutionCapableを設定しておくとRetinaディスプレイに対応できます。

PyInstallerを実行

上記で作ったspecファイルを使ってPyInstallerを実行してみましょう。下記コマンドを実行してください。

$ pyinstaller helloworld.spec

そうすると下記のように実行が開始されます。

49 INFO: PyInstaller: 3.4
49 INFO: Python: 3.7.1
58 INFO: Platform: Darwin-18.2.0-x86_64-i386-64bit
64 INFO: UPX is available.
66 INFO: Extending PYTHONPATH with paths

実行が終わると、distフォルダに「helloworld.exe」または「helloworld.app」が作成されています。それを実行するとアプリケーションが起動します。

動作確認

「helloworld.exe」または「helloworld.app」を実行してみましょう。

先ほどと同じようにアプリケーションが起動したら成功です。

終わりに

今回はwxPythonを使用してHelloWorldを表示しアプリケーション化するところまで説明しました。

初心者向けの内容でしたので「さらなる情報を知りたいよ」という方向けに有用なリンクをご紹介します。

今後はwxPython以外にもPySide2などのGUIアプリケーションについてもご紹介できたらなと考えています。

それでは、また!

コメント

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