アプリ版:「スタンプのみでお礼する」機能のリリースについて

wxpythonを研究で利用しなくてはいけなくなり、猛勉強をしております。

今までBASIC、Cを主に利用していたのでオブジェクト指向が分からず四苦八苦……
以下の「やりたいこと」のやり方をご存じの方がいらっしゃいましたら、ご教授ください。

●やりたいこと
ボタンをクリック → ファイル参照ダイアログ → ファイルの選択 → エディットボックスにフルパスをセット

●私が書いたスクリプト
import wx

def OnOpen(self,e):
wx.MessageBox('Download completed', 'Info')
self.dirname = ''
#dlg = wx.FileDialog(self, "select file", self.dirname, "", "*.*", wx.OPEN)



app = wx.App()

frame = wx.Frame(None, -1, 'Morphological Analysis', size=(640,480))#ウインドウ初期化
#▽ウインドウの設定ここから

frame.Centre()#中央表示

panel = wx.Panel(frame,wx.ID_ANY)#フレームのハンドルを取得
button_1 = wx.Button(panel,wx.ID_ANY,"Select File",pos=(30,30))
button_1.Bind(wx.EVT_BUTTON,self.OnOpen)



#ウインドウの設定ここまで△
frame.Show(True)#ウインドウ表示

app.MainLoop()


selfはJAVAで言うthisぽいなぁと思いつつ。
しかし、JAVAもしばらく触れてない上にそもそもにほぼ触ってないので覚えておらず。

症状としては、エラーを吐かずにすぐにプログラムが終了してしまうという状況です。

よろしくお願いします。

A 回答 (6件)

そうか、基本的なところからわかってないんだなぁ。



Pythonには今のところPython2系列とPython3系列があって、
この両者は文法が少し違う。
今はこの2つが並存している時期なので注意が必要。
Python2とPython3ではモジュールの作り方も違うので、
まだPython3に対応していないモジュールとかライブラリもある。

wxPythonはまだPython3の安定リリースが出ていないから
たぶん君が使ってるのはPython2だ。
確かめるにはコンソールから python -V とやる。
もし Python 2.7.6 とか出てきたらPython2系列だ。

MeCabは使ったことがないので、
wxPythonと競合するかどうかはわかない。
もちろん、単体で import MeCab してみて動くことを確認したんだよね?
(してなかったら、私は呆れるっすよ。)
もしそうなら、私の手には負えないので
新しく質問を作ったほうがいいです。

> とりあえず、文法的には
> app = wx.App(redirect=False)
> と
> app.MainLoop()
> の間にイベントを書けばいいのでしょうか。
> そう解釈しております(Cで言うプロトタイプ宣言的な?)

うーん、まー、基本的にはそうなるんだけど、
Pythonにはプロタイプ宣言がない。
というか宣言自体がない。
ソースコードを一行一行、上から実行していって、
変数やら関数が出てきたら
「その場で」変数や関数を作っている [*]。
作る前から参照はできない。
だからグローバル変数に依存しているような関数は
自由な場所に置けなくなる。
これがスパゲッティ化する理由。

> オブジェクト指向勉強すべきかなぁ……

wxPythonのサンプルコードはほぼ全てクラスを使って書かれているので、
継承とか知らないと厳しいかも。


[*] 正確にはソースコードを実行する前にバイトコードにコンパイルしているので、
どんな変数や関数があるのかは実行する前にわかっている。
でも実際の関数が作られるのは def が出てきた場所になるので、
それ以前の行から関数を参照することはできない。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

>Pythonには今のところPython2系列とPython3系列があって、この両者は文法が少し違う。
互換性的なものがないんですね……まだまだ勉強し始めで全く分かってません。
Python 2.7.6でした。

>もちろん、単体で import MeCab してみて動くことを確認したんだよね?
まー、さすがにこれでもプログラマの端くれくらいまでにはなってきてると思うので、やってますね。
コンソールでMeCabを使って形態素解析のスクリプトは組んで、実行と結果が結びついている状態で、それをwxPythonの方に移動させると起動エラーが出る。

で、いろいろ実験した結果なのですが、
・wxPythonは32bit環境で動作する
ということなので、
・$ arch -i386 python text.py
こんな感じで起動させてるのですよ。(調べて出てきたコマンドなので何してるかは分かりませんが、32bitで起動させてるんでしょうね)

そしておそらくMeCabさんは64bitで起動すると……
この辺りの問題だと踏んでいます。
MeCabに32bit用があったかなぁ……

wxPythonに64bitで起動出来る方法ってありますでしょうか……?

お礼日時:2013/12/11 11:36

非常に残念なことに, 安定版の wxPython は 32ビットものしか用意されていないようです.



参考URL:http://www.wxpython.org/download.php#unstable
    • good
    • 0
この回答へのお礼

ご回答有難うございました。

あー……やっぱり対応していませんか……
取り敢えず、他のGUIツールを探してみます。

pygletが文法的にも馴染みやすいかなぁと思ってみたり

お礼日時:2013/12/16 13:43

かなり「いまさら」感はあるし私自身 Python は全くダメ (どうも「ネストをインデントで表す」のが体質に合わない) なんですが 1つだけ:


「wxとMeCabをimportするとすごくエラーが出る」ということですが, 具体的に
・どんなプログラムに対して
・どんなエラーが出ているのか
を書いた方が識者の意見を得やすいと思いますよ. 少なくとも
・wx と MeCab との相性が悪い
のか, それとも
・ただ単にあなたの書いたプログラムが悪い
のかは (分かる人なら) 判断できそうな気がしますし.
    • good
    • 0

No.2


> 実行方法によるもので「エラーメッセージが読めない」だけでは?

コンソールから実行しても読めないって。

WindowsかMacだと、wx.App() を実行した時点で、
sys.stderr が独自の画面にリダイレクトされるようになるから
MainLoop() 以前のエラー表示は一瞬で終わる。

こうならないように
wx.App(redirect=False)
としてある。

参考URL:http://www.wxpython.org/docs/api/wx.App-class.ht …

この回答への補足

すいません、もう一つ。
wxとMeCabをimportするとすごくエラーが出るのですが、
wxpythonとMeCabは同時に扱うことが出来ないのでしょうか。

補足日時:2013/12/09 12:51
    • good
    • 0
この回答へのお礼

wettiさん

ご回答有難うございます。
やりたい事が出来ました。

まず、バージョンと環境の件について。
申し訳ありません、完全に失念しておりました。
一応いまさらですが、Macintoshのスノウレパードでやっていました。
pythonのバージョンは……最近入れたので3でしょうか?
とりあえず突っ込んでみた感じですね。

次に、wxpythonとtkinterについて。
そもそもpythonと言うもの自体初で、教授に使えと言われたので勉強を始めました。
2週間後にはこれをまとめて論文ですよ。
tkinterというものは初めて聞きます。(と、いうよりwxpythonもたまたま教授が言ったのでそのまま使ってるだけですが……)
使い勝手がいいならそれを使いたいですね。とりあえず形態素解析のプログラムをGUI化するというところです。

最後に完全に関係無いですが、Codepadと言うサイトを初めて知り、すごく感動しております。
むしろこれの存在を教授して頂いて本当にありがたいです。
質問するか悩んでいたのですが、思い切って質問してよかったと思います。聞くは一時の恥聞かぬは一生の恥…っと。

とりあえず、文法的には
app = wx.App(redirect=False)

app.MainLoop()
の間にイベントを書けばいいのでしょうか。
そう解釈しております(Cで言うプロトタイプ宣言的な?)

出来ればスパゲッティは避けたいですね……オブジェクト指向勉強すべきかなぁ……

お礼日時:2013/12/09 00:25

ここって「空白をまとめる」という仕様のせいで、Pythonの質問には致命的なんです。



> 症状としては、エラーを吐かずにすぐにプログラムが終了してしまうという状況です


エラーは出るはずです。
実行方法によるもので「エラーメッセージが読めない」だけでは?
(Windowsでダブルクリック→エラー表示してすぐ終了するので、メッセージを読む時間が無い、とか)
    • good
    • 0
この回答へのお礼

kmeeさん

ご回答有難うございます。
wettiさんの仰る通り、エラーを吐かずに一瞬で終了していました。

>ここって「空白をまとめる」という仕様のせいで、Pythonの質問には致命的なんです。
そうですね、とりあえず必要部分だけ抜き出したので今回はまだましだったかなと思います。
codepadを以降使わせていただきたいと思います

お礼日時:2013/12/09 00:27

オブジェクト指向は使わなくても書けるっす。


http://codepad.org/ywov67Fk
ただし、ソースコードが激しくスパゲッティ化するけどね。

それから、この程度の内容であれば
wxPythonじゃなくてtkinterでもいいような気がする。
GUIライブラリが鎬を削るPython界において、
Python3対応の遅れているwxPythonは今後もずっと使えるかどうか不安なんすよ。

あと、プログラミングの質問をするときは、
使用しているインタープリタやらライブラリやらのバージョンと、
OSの種類をきちんと書いてください。
OSやバージョンによって書き方や説明が違う場合もあるし、
それらをいちいち調べて回るのも面倒なんで。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!