『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

wxPythonで作ったものを.appでビルドしてみる

nnsnodnb.hatenablog.jp

上記記事より先に下書きになってたんで掘り出しました。
メモ代わりなのでたくさん端折ります。

easy_installが使えることが前提で話を進めていきます。
インストーラーでPythonをインストールした場合は使えなかったと思います。

nnsnodnb.hatenablog.jp

詳しくは過去記事をご確認ください。

py2appというものが主流らしいのでこれでビルドしてみます。
Windowsで使えるようにするにはpy2exeというものがあるらしいです

easy_install py2app

ビルドしたいPythonプログラムのあるフォルダ内で以下を実行

py2applet --make-setup sample.py

フォルダ内にsetup.pyというファイルが作られます。

"""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['sample.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': True}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

中身はこんな感じ。ここをいじることでアイコンを変えられたりするらしいです。

python setup.py py2app -A

フォルダ内にbuilddistというフォルダが作成されるのでdist内にビルドしたファイルがあります。

いろいろとテストはしていないので、対処法とかはわかりませんが、起動すると上手くいかない事態が起こっています。
謎です。わかる方いらしたら教えて下さい。

Hello_world.py

# -*- encoding: utf-8 -*-
import wx

app = wx.App()

frame = wx.Frame(None, -1, 'Hello World!')
frame.Show()

app.MainLoop()

上のような一番シンプルなアプリは問題なく起動できるのですが、昨日(現在:平成27年4月21日)作った
wxPythonで作るsuperπもどきではエラーが発生しました。

一応ソースコードです。

# -*- encoding: utf-8 -*-
import wx
import time

N = 10000

# 円柱率小数点以下の算出
def ppii(n) :
    a , b , i = 10 ** n , 10 ** n , n * 8 + 1
    while i >= 3 :
        a , i = (a + b + b ) * (i / 2) / i , i - 2
    return a - b

# アプリケーションの初期化
app = wx.App()

# フレームの初期化
frame = wx.Frame(None , -1 , 'superπをwxPythonで作ってみる')

# パネル作成
panel = wx.Panel(frame , -1)

# ファイルへの書き出し
start = time.time()
f = open('result.txt' , 'w')
f.write('3.\n' + str(ppii(N)) + '\n')
f.close()
elapsed_time = time.time() - start

# 計算結果をresultに格納
#result = wx.TextCtrl(panel , -1 , ('3.' + str(ppii(1000)) + '\n'))
result = wx.StaticText(panel , -1 , ('3.' + str(ppii(40)) + '...\n'))

# resultへの書き込みを拒否
#result.Disable()

st1 = wx.StaticText(panel , -1 , '\n\n' + str(N) + '桁の計算終了\n')
res = wx.StaticText(panel , -1 , '\n\n\n' + str(elapsed_time * 100) + 'ミリ秒')

# レイアウト作成
layout = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(layout)

# ステータスバー作成
frame.CreateStatusBar()
frame.SetStatusText('super_pi.appと同ディレクトリ内に結果ファイルを出力しました。')

frame.Show()
app.MainLoop()

(データを更新してたの忘れてました。GitHub上のコミットデータみてくださると嬉しいです。
上記のソースコードでも同じようになりました。) これをビルドしてあげると...

f:id:nanashinodonbee:20150421171345p:plain

こんな感じになりました。それで一応テストとして違うファイルを新しく作っていろいろ試したところ、

if __name__ == "__name__"

こいつを付けなかったら起動に成功しました。そして、superπもどきを実行!!

できない!!

闇が見えそうなので諦めました。

わかる方いらしたら教えてくださると幸いです