- Rectangle、TextBlock 追加(8/24)
IronPython で WPF を使ってみたら、結構いろいろおもしろかった。
でもあれこれ押さえておかないとプチ苦労するので、そこら辺をまとめてみたメモ。随時更新。
ちなみに作ったものはこんなプレゼンツール。
最初に参考リンク
やっぱり 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
▽効果
必要なもの
- IronPython 1.1
- 2.0 Alpha も出てるけど、安定している(かもしれない)方で。
- .NET Framework 3.0
- XP なら必要。Vista ならたぶん不要。
WPF の API を原始的にぺしぺし叩くだけなら、以上で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]