Pythonでデスクトップアプリを作成しよう

Pythonでデスクトップアプリを作成する場合のメモ

基本的なところは省略。 あまり書かれていない事の覚書中心

①AnacondaでPython環境を一気にインストール

www.anaconda.com

Anaconda Navigatorに追加しておきたい channels:
 conda-forge(必須)
おまけ 
 open3d-admin (point cloud用にopen3dを使う時)
 fastai (deep learning 用)
 pytorch (deep learning 用)

モジュールのインストールは安易にpipを使わないでcondaを使う
ソフトが安定して動いたらモジュールのバージョンアップは極力行わない

IDEは標準インストールされているspyderを使う

GUIアプリケーションの骨格はwxpython(Phoenix)を使う

Anaconda Navigatorでwxpythonをインストールしspyderでimportして使用

docs.wxpython.org

使い方は豊富なdemoを見るのが良い。GitHubからダウンロード。

github.com

demoの中のmain.pyを実行すると、コードと実行結果が見れるブラウザが立ち上がる。
バージョンチェックでエラーが出る時は、チェックの部分をコメントアウトしてしまえばいい。

④画面はwxformbuilderで作成する

wxpythonを使用しても画面構成をコードで記述していくのは大変なのでwxformbuilderを使用する。

github.com

ダウンロードしてインストール。windows版はお行儀悪くexeで置いてあるのでedgeだとダウンロードできない。chrome等を使うと楽。 pythonC++等の画面コードも生成可能。

pythonコードを書き出すように設定して置いてgenerate codeで画面とeventを記述したpythonファイルを書き出して使用する。
書き出されたファイルは画面を修正する事もあるので手修正してはいけない。
書き出されたファイルを継承したクラスを作り、それにコードを記述していく。
継承クラスはwxformbuilderのGenerate Inherited Classで作ることも出来るが、自身でコードを書き込んでいくファイルなので、上書きしてコードを消してしまわないように使用は1度きりにする。
画面を修正してeventを追加した時には、generate codeのファイルから追加したevent関数を継承ファイルに自分でコピーして使用する。コピーする時の注意として、インデントのフォーマットが違っている可能性があるので、spyderのソース-インデントの修正でエラーを消す。

⑤matplotlibのfigureを埋め込む方法

wxformbuilderでmatplotlibのfiguerを埋め込むためのpanelを作っておく。
継承クラスでそのpanelにfiguerを埋め込んで使用する。

import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg as NavigationToolbar
import matplotlib.pyplot as plt
........................
        self.fig, self.ax = plt.subplots()
        self.figcan = FigureCanvas(self.m_panel, -1, self.fig)

        self.CSizer = wx.BoxSizer( wx.VERTICAL )
        self.CSizer.Add(self.figcan, 1, wx.EXPAND, 0 )
        self.m_panel.SetSizer( self.CSizer )
        self.m_panel.Layout()

        self.ntoolbar = NavigationToolbar(self.figcan)
        self.ntoolbar.Realize()
        self.ntoolbar.Hide()

        # self.fig.canvas.mpl_connect('button_release_event', self.on_button_release)
        # self.fig.canvas.mpl_connect('button_press_event', self.on_button_press)
        # self.fig.canvas.mpl_connect('pick_event', self.on_pick)
        # self.fig.canvas.mpl_connect('motion_notify_event', self.on_motion)
        # self.fig.canvas.mpl_connect('key_press_event', self.on_key_press)

        self.fig.canvas.draw()

⑥exeファイルにまとめる為にpyinstallerを使う

Anaconda Navigatorでpyinstallerをインストール
Anaconda Promptを起動し cdでディレクトリーをターゲットのソフトの場所に切り替える。
pyinstaller main.py --onefile --noconsole --clean