Tkinterとpy2appでMac用appを作ってみる


Mac用のアプリが作りたい。

ウェブページの製作などでお手伝いさせてもらっているお店から、コロナの影響でオンラインを中心に事前注文を受けるオンラインショップの注文内容をまとめるにはどうすればいいかという相談をいただいた。エクセルでまとめてもいいんだけど、簡単なアプリを作れないか思って、調べながら作ることにした。

 Tkinter

https://python-textbok.readthedocs.io/en/1.0/Introduction_to_GUI_Programming.html
Introduction to GUI Programをコピペして実行してみる。ちなみにTkinterはpythonにもともと入っている場合が多いようで、Macで開発するのであれば特にインストールなどは必要ないらしい。
このページの最後にある電卓のサンプルプログラムを実行してみる。

出ているはずの+と-が出ない。色々やってみたんだけど、tkinterと後述のpy2appがpythonのバージョンやインストール元の影響を非常に受けやすいらしく、pyenvとminiconda等色々インストール元を変えて試しましたが、結局OSをCatalinaにアップデートして、おそらく純正で入っていたPython3.8.2(違ったらすみません!)とvirtualenvで成功。この辺の失敗録かなんかを記録しておくといい記事になるんだろうけど、きちんと記録してないので、次回から何かするときは記録することにします。

一件落着。ここで、サンプルプログラムをみて、必要な部分を変えていきます。

 作業

csvファイルを読み込み、集計結果を出力するプログラムなので、インターフェースはファイル名を表示する部分と、ディレクトリ呼び出しボタン、実行ボタンの三つでいいよねってことで、側だけ作ることにした。サンプルで定義されているクラスを、自分用のクラスに書き換えて、ボタンを一つけすだけの簡単な作業。

これで良さそう。次は中身を作ってみましょう。参考にしたのはこちらこちらのqiitaの記事。(初心者なのでもっといい引用の方法があれば教えてください。)tkinterのfiledialogはこのチュートリアルを参照しました。
データ整理はいつものPandas. ウェブサイトのCSVを読み込んで、商品名のデータフレームサブセットを作り、集計します。

#固有の値だけをリスト化
self.itemlist=df["Item's Name"].unique()
#サブセットデータフレームから合計個数を計算
result={}
for item in self.itemlist:
  tempdf=df.loc[df["Item's Name"]==item]
  sumqty=tempdf["Qty"].sum()
  result[item]=sumqty

Mac用バイナリ作成

Mac用のバイナリを作成します。このサイトを参考に、py2appを使ってみましたが、Macが落ちたりappが開けなかったり、云々。
依存性の問題を色々クリアするためにこちらのサイトを参考に、virtualenv環境で必要なライブラリをpipでvirtualenvにいれ(今回はpandasとpy2appだけだったと思います)、ようやくアプリを作ることに成功しました。

py2appの使い方自体は非常に簡単で

py2applet --make-setup test.py
python setup.py py2app

これだけでできちゃいます。依存ライブラリはvirtualenvできちんと分けてあげないとうまくいかないようですが。
こうして、ようやくアプリ人生第一弾ができました。コードは1日でできても、アプリにするのに2日余計にかかりました笑
口調がコロコロ変わってすみません。またお会いしましょう。