Python側で宣言した変数の値を取得する
続けて、Python側で宣言した変数の値を取りだす方法について見ていきましょう。次のC#のコードではクリックされたボタンのサイズを変更しています。
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」は次のようになっています(エンコード宣言やコメントなどは除いています)。
height = 300 width = 300
実行結果は次のようになります。
反映されない値
このサンプルでは、btnSimple2.Heightプロパティ(int型)を、height
という名前でGlobalsに登録しています。そして、Pythonスクリプトでheight変数の値を変更しています。しかし、実行結果では、ボタンの高さは変わっていません。これはGlobalsプロパティに数値や文字列といった基本型を設定しても、呼び出し元の変数には反映されないという仕様のためです。この動作に気付かないと悩んでしまうこともありますので、少し気にかけておくと良いでしょう。
Pythonスクリプトの変数の値を取得する
そこで、このような基本型の値を受け渡すには、PythonEngineクラスのEvaluateAs
メソッドが役立ちます。
EvaluateAs<変換する型>("取得するPython変数名")
ここではpe.EvaluateAs<int>("width")
というコードによって、Python側で宣言されたwidth
の値をint型で取得しています。この値をボタンのWidthプロパティに設定することでボタンの横幅を変更しています。
.NET Frameworkの利用
続けて、.NET Frameworkのライブラリを利用する例について見ていきます。C#やVB.NETプログラマにとって、使い慣れた.NET Frameworkのライブラリを使えることは大きな魅力です。次のコードではフォームの色をランダムに変更しています。
private void btnColor_Click(object sender, EventArgs e) { PythonEngine pe = new PythonEngine(); pe.Globals.Add("MyForm", this); pe.ExecuteFile(@".\..\..\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を利用する手順を確認していきましょう。
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に書き換えても良いでしょう。