IronPython で WPF を使うメモ

  • Rectangle、TextBlock 追加(8/24)

IronPythonWPF を使ってみたら、結構いろいろおもしろかった。
でもあれこれ押さえておかないとプチ苦労するので、そこら辺をまとめてみたメモ。随時更新。
ちなみに作ったものはこんなプレゼンツール

最初に参考リンク

やっぱり MSDN ライブラリ。
C# のコードを参考に、型宣言と new と ; を取り除けばほぼ IronPython のコードになるので有り難い。
量が膨大なので、とりあえず参考になりそうなところをピックアップ。


▽基本

パネルの概要
http://msdn2.microsoft.com/ja-jp/library/ms754152(VS.80).aspx
フロードキュメントの概要
http://msdn2.microsoft.com/ja-jp/library/aa970909(VS.80).aspx
ブラシの概要
http://msdn2.microsoft.com/ja-jp/library/aa970904(VS.80).aspx
純色およびグラデーションによる塗りつぶしの概要
http://msdn2.microsoft.com/ja-jp/library/ms754083(VS.80).aspx
イメージングの概要
http://msdn2.microsoft.com/ja-jp/library/ms748873(VS.80).aspx

▽アニメーション

アニメーションの概要
http://msdn2.microsoft.com/ja-jp/library/ms752312(VS.80).aspx
キー フレーム アニメーションの概要
http://msdn2.microsoft.com/ja-jp/library/ms742524(VS.80).aspx
ストーリーボードの概要
http://msdn2.microsoft.com/ja-jp/library/ms742868(VS.80).aspx

▽変換

変換の概要
http://msdn2.microsoft.com/ja-jp/library/ms750596(VS.80).aspx
方法:オブジェクトに複数の変換を適用する
http://msdn2.microsoft.com/ja-jp/library/ms750975(VS.80).aspx

▽効果

ビットマップ効果の概要
http://msdn2.microsoft.com/ja-jp/library/ms743435(VS.80).aspx

必要なもの

  • IronPython 1.1
    • 2.0 Alpha も出てるけど、安定している(かもしれない)方で。
  • .NET Framework 3.0
    • XP なら必要。Vista ならたぶん不要。

WPFAPI を原始的にぺしぺし叩くだけなら、以上でOK。
IronPython を展開してできる Tutorial ディレクトリは軽く眺めておくのが吉。


SilverLight もすごく興味あるけど、触るのはせめて 1.1 Beta が出てからと心に決めているので。いろいろ作法が違うらしいから、ここに書いてあることは使えない可能性大。

Hello WPF via IronPython

IronPython の Tutorial ディレクトリに移動、IronPython を起動し、WPF のウィンドウを表示してみる。

$ ipy
> from avalon import *
> w = Window()
> w.Show()

IronPython から WPF を使うにはこのように Tutorial ディレクトリにある Avalon.py を import するのが手っ取り早い。
画像操作やビットマップ効果を使いたい場合は Avalon.py にさらに以下の2行を足しておくといい。

from System.Windows.Media.Imaging import *
from System.Windows.Media.Effects import *

要素を好きな場所に配置できる Canvas を Window に載せて、そこに赤い四角を追加、(200, 100) に表示してみる。

w.Content = cv = Canvas()

rect = Rectangle()
rect.Width = 100
rect.Height = 100
rect.Fill = Brushes.Red
cv.Children.Add(rect)

Canvas.SetLeft(rect, 200)
Canvas.SetTop(rect, 100)

Canvas のように複数の要素を配置できるコントロールを「パネル」と言う。他に Grid とか StackPanel とかあり。

プロパティ

rect = Rectangle()
rect.Width = 100
rect.Height = 100
rect.Fill = Brushes.Red

四角を生成するには、Rectangle インスタンスを生成して各種プロパティを設定する必要がある。面倒。
せっかく python なんだから、

def setprop(obj, **prop):
  for attr in prop:
    obj.__setattr__(attr, prop[attr])
  return obj

というのを定義しておけば、同じものが

rect = setprop(Rectangle(), Width=100, Height=100, Fill=Brushes.Red)

と書ける。
WPF ではビジュアルやインターフェースは XAML で書くのが一般におすすめなのだろうけど、IronPython でこう書けるなら XAML とタイプ量変わらんかむしろ少ないし自由度高いし、もうこれでいいんじゃなかろうかと。

色はブラシで制御する。
グラデーションとか画像での塗りつぶしとかいろいろできるが、まずは基本のべた塗り。

Brushes に結構いろいろ色がプリセットされている。赤とか青とか単純な色ならこれでOK。

> dir(Brushes)
['AliceBlue', 'AntiqueWhite', 'Aqua', 'Aquamarine', 'Azure', 'Beige', 'Bisque',
'Black', 'BlanchedAlmond', 'Blue', 'BlueViolet', 'Brown', 'BurlyWood', 'CadetBlu
e', 'Chartreuse', 'Chocolate', 'Coral', 'CornflowerBlue', 'Cornsilk', 'Crimson',
 'Cyan', 'DarkBlue', 'DarkCyan', 'DarkGoldenrod', 'DarkGray', 'DarkGreen', (中略) ]
> len(dir(Brushes))
155

といっても足りるわけないので、自分で指定したい場合は ColorConverter.ConvertFromString() で Color を作って、 SolidColorBrush インスタンスを生成するのが一番簡単。

color = ColorConverter.ConvertFromString("#52a221")
brush = SolidColorBrush(color)
rect.Fill = brush

ConvertFromString は XAML と同様に幅広い色の表記を変換できる。例えば "#8052a221" のようにアルファチャネルを指定するとかとか。
よく使うので、なんかメソッドを定義しておくのが吉。

def getColor(st): return ColorConverter.ConvertFromString(st)

rect.Fill = SolidColorBrush(getColor("#52a221"))

Rectangle の使いそうなプロパティ

矩形。角丸四角も表現可。[] 内は設定・取得する値の型。
使いそうな(実際に自分が使った)プロパティをまとめた。

Width, Height
幅、高さ [Double]
Opacity
透明度 [Double]
RadiusX, RadiusY
角丸の半径 [Double]
Fill
塗りつぶしに使うブラシ [Brush]
Stroke
枠線を描画するブラシ [Brush]
StrokeThickness
枠線の太さ [Double]
RenderTransform
変形(別途) [Transform]
BitmapEffect
ビットマップ効果(別途) [BitmapEffect]

rect = setprop(Rectangle(), 
  Width=100, Height=50, Opacity=0.8,
  RadiusX=3, RadiusY=3, 
  Fill=Brushes.Red, 
  Stroke=Brushes.Green, StrokeThickness=5,
  RenderTransform = setprop(RotateTransform(), Angle = 45),
  BitmapEffect = DropShadowBitmapEffect())

TextBlock の使いそうなプロパティ

文字列を描画する方法はいくつもあるが、 Canvas 上に乗せるなら TextBlock が良さげ。

Text
表示する文字列 [String]
FontSize
フォントサイズ [Double]
FontFamily
フォントファミリー。 FontFamily(u"メイリオ") のように指定する [FontFamily]
FontWeight
フォントウェイト。 FontWeights.Bold 等を指定 [FontWeight]
ActualWidth, ActualHeight
実際の画面上での表示サイズ。ただし画面に完全に表示されなければ取得できない。テキストの表示サイズをとって画面中央に表示したいという場合は、アニメーションの CurrentTimeInvalidated イベントにひっかけて、表示された瞬間にサイズ取得、などの工夫が必要。
Opacity
透明度 [Double]
Foreground, Background
前景、背景を描画するブラシ [Brush]
Padding
パディング。 Thickness(10, 15, 10, 15) のように指定 [Thickness]
TextAlignment
配置。 TextAlignment.Center などを指定 [TextAlignment]
RenderTransform
変形(別途) [Transform]
BitmapEffect
ビットマップ効果(別途) [BitmapEffect]