SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C#とIronPythonで変化に強いWindowsアプリケーションを作る

C#から動的言語であるIronPythonを実行する

  • X ポスト
  • このエントリーをはてなブックマークに追加

Python側で宣言した変数の値を取得する

 続けて、Python側で宣言した変数の値を取りだす方法について見ていきましょう。次のC#のコードではクリックされたボタンのサイズを変更しています。

ボタンのサイズの変更(Form1.cs)
private void btnSimple2_Click(object sender, EventArgs e)
{
    PythonEngine pe = new PythonEngine();
    pe.Globals.Add("height", this.btnSimple2.Height);
    pe.ExecuteFile(@".\..\..\2nd.py");
    this.btnSimple2.Width = pe.EvaluateAs<int>("width");
}

 「2nd.py」は次のようになっています(エンコード宣言やコメントなどは除いています)。

2nd.py
height = 300
width = 300

 実行結果は次のようになります。

実行前
実行前
実行後(ボタンの幅が変わる)
実行後(ボタンの幅が変わる)

反映されない値

 このサンプルでは、btnSimple2.Heightプロパティ(int型)を、heightという名前でGlobalsに登録しています。そして、Pythonスクリプトでheight変数の値を変更しています。しかし、実行結果では、ボタンの高さは変わっていません。これはGlobalsプロパティに数値や文字列といった基本型を設定しても、呼び出し元の変数には反映されないという仕様のためです。この動作に気付かないと悩んでしまうこともありますので、少し気にかけておくと良いでしょう。

Pythonスクリプトの変数の値を取得する

 そこで、このような基本型の値を受け渡すには、PythonEngineクラスのEvaluateAsメソッドが役立ちます。

EvaluateAsメソッド
EvaluateAs<変換する型>("取得するPython変数名")

 ここではpe.EvaluateAs<int>("width")というコードによって、Python側で宣言されたwidthの値をint型で取得しています。この値をボタンのWidthプロパティに設定することでボタンの横幅を変更しています。

Pythonでの型の宣言について
 C#で変数を宣言するときは「int width = 300;」というように型を宣言する必要があります。しかしPythonでは「width = 300」というように型を宣言する必要はありません。値が代入されたタイミングで、自動的に型が推論されます。

.NET Frameworkの利用

 続けて、.NET Frameworkのライブラリを利用する例について見ていきます。C#やVB.NETプログラマにとって、使い慣れた.NET Frameworkのライブラリを使えることは大きな魅力です。次のコードではフォームの色をランダムに変更しています。

フォームの色の変更(Form1.cs)
private void btnColor_Click(object sender, EventArgs e)
{
    PythonEngine pe = new PythonEngine();
    pe.Globals.Add("MyForm", this);
    pe.ExecuteFile(@".\..\..\3rd.py");
}

 「3rd.py」の中身は次のとおりです。

3rd.py
#.NET Frameworkのクラスライブラリを使う宣言
import clr

#Colorクラスを利用して前景色を変更
clr.AddReference("System.Drawing")
from System.Drawing import *
MyForm.ForeColor = Color.White

#RandomクラスとColorクラスを利用して背景色を変更
from System import *
random = Random()
MyForm.BackColor = Color.FromArgb(random.Next(255), random.Next(255), random.Next(255))

 実行結果は次のようになります。

実行後(ランダムに背景色が変わる)
実行後(ランダムに背景色が変わる)

.NET Frameworkを使う手順

 それでは、.NET Frameworkを利用する手順を確認していきましょう。

.NET Frameworkを使う宣言
import clr

 import命令は、標準では利用できない拡張コードを読み込む命令です。ここでは、CLRモジュールをインポートすることによって、.NET Frameworkを利用できるようになります。

アセンブリへの参照設定
clr.AddReference("System.Drawing")

 次に、clr.AddReference("アセンブリ名")メソッドを記述することで、アセンブリに対する参照設定します。参照するdllは、カレントフォルダ、Libフォルダ(IronPythonでライブラリを格納するフォルダ)、GAC(「システムフォルダ\Assembly」)の順に検索されます。ファイル名を指定して参照設定をしたい場合には、clr.AddReferenceToFile("パス")メソッドが使用できます。

クラスの読み込み
from System.Drawing import *

 from ~ import命令を使うと、.NET Frameworkのクラスを利用できるようになります。名前空間に存在する全てのクラス群を利用できるようにするにはfrom 名前空間名 import *と記述します。個々のクラスを利用できるようにする場合はfrom 名前空間名 import クラス名と記述します。

 なお、筆者が確認した限り、IronPythonでは完全修飾名(名前空間名+クラス名)でクラスを使うことはできませんでした。IronPythonではfrom ~ import命令を使って、利用可能なスコープにクラスを読み込みます。そのため、クラス名が同じクラスを複数インポートした場合には、後からインポートした方が有効となります。

クラスの利用
MyForm.ForeColor = Color.White

 System.Drawing名前空間のColorクラス(正確には構造体)を利用して、フォームの前景色を白色に変更できました。同様にランダムな値を生成できるRandomクラスを使って背景色を設定しています。

 以上で、IronPythonから.NET Frameworkを使ったコードを書くことができました。もしPythonのコードに慣れていなければ、いったんC#で.NET Frameworkを使ったコードを書いてからPythonに書き換えても良いでしょう。

Pythonでのインスタンス化
 C#に慣れていると「random = new Random()」と書いてしまいがちですが、Pythonではnew句は必要ありません。「random = Random()」と書くことで正しくインスタンスが作られます。

次のページ
応用例(RSSの取得)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

百賀 吟平(モモガ ギンペイ)

主に.NETを使ったアプリケーション開発に従事するプログラマー。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2187 2008/02/25 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング