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()
とする。
(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()
とする。