路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

Re: IronPythonでマルチプラットフォームGUIの可能性 番外編

2009-07-09 20:59:25 | プログラミング
記事「MicrosoftはC#とCLIに特許を主張せず - .NET互換「Mono」への影響は?」
http://journal.mycom.co.jp/news/2009/07/09/019/index.html
より。

C#やCLIのうち、ECMAがカバーしている(つまり標準化された)部分については「Microsoftは特許などの権利を主張することはな」いんだそうです。

・・・Winformsは入ってませんけど。まあ。

最近、MSの動きが速くなったような?

IronPythonの、というかSharpDevelop 3.1ベータのハウを知る

2009-07-09 16:20:36 | プログラミング
Sharp Develop 3.1ベータを使って、IronPythonでGUIアプリを書く実験をしてます。

(IronPythonStudioだとUIをXAMLで記述することになるのですが、少し大げさすぎる気がするので。)

で、ちょっと気づいたこと。

●GUIデザイナで生成されたコードをいじらない方法

GUIデザイナ(というかデザインタブというか)でフォームにボタンやらラベルやらをぺたぺたと貼り付けるとUIのコードが生成されるのですが、

イベントハンドラ(というかボタンが押されたときに呼び出されるメソッド)の中身は、初期状態でpassになっていて、それを書き換えろと言わんばかりになっています。

もちろん書き換えたあとで、GUIデザイナを使ってボタンを足したり、とかは問題なくできるのですが、やっぱりなんとなーく気持ち悪い。

生成されたコードをいじらないで何とかならないか?ということで試行錯誤。

結果、成功した方法は、MainFormを継承したクラスを作るというもの。

(1) 生成されたクラスのMainFormはそのままにしておいて、MainFormを継承したクラスを作ってMyMainFormとする。

(2) MainFormのイベントハンドラ(であるメソッド)の中身を書き換える代わりに、MyMainFormでイベントハンドラのメソッドをオーバーライドする。

(3) エントリポイントとなるProgram.pyでMainFormを使っているところはMyMainFormに書き換える。(あるいは、Program.pyを書き換えるのがイヤならMyProgram.pyを作るのもアリです)

●アバウトダイアログをGUIデザイナで作りたい

どうも、GUIデザイナで触れるクラスはMainFormのみらしく、後からダイアログのクラスを付け足してGUIデザイナで作る、とかはできないらしい。

では、アバウトダイアログはガリガリ手書きするのか?いくらなんでもそりゃないでしょ、ということで。

試行錯誤した末、アバウトダイアログのためにひとつプロジェクトを作ってやる方法でうまくいきました。

(1) アバウトダイアログを付け足したいアプリのソリューションを右クリックして、新しいプロジェクトを作る・・・

(2) このとき、新しいプロジェクトのディレクトリが、元のアプリの子ディレクトリになるようにする。

たとえば、元のアプリがc:¥MySolution¥MyAppだったら、新しいプロジェクトはc:¥MySolution¥MyApp¥AboutDialogとかにする。

(3) 新しいプロジェクトを元のアプリのプロジェクトからインポートできるようにする。c:¥MySolution¥MyApp¥AboutDialogに__init__.pyを作る。

中身は、「from MainForm import MainForm」1行のみ。

これにより、新しいプロジェクトのMainForm.pyというファイルで定義されているMainFormというクラスを、元アプリからAboutDialog.MainFormという名前でアクセスできるようになる。

(4) 新しいプロジェクトのMainFormをGUIデザイナでアバウトダイアログとして設計する。

copyrightを書いたり、OKボタンを付けたり。

(5) 元アプリのメニューに「about」を作ってやり、そのイベントハンドラ(であるメソッド)の中身を

import AboutDialog
AboutDialog.MainForm().Show()

とする。