WPFがSingle Thread Affinityであることを知らなかったので、記事を修正しました。([i]の部分)
EfficeonでHDDが20GBしかない古いモバイルノートPCでWPFは無理orz
と思っていたのですが、空き容量500MB強のC:ドライブからD:ドライブにページングファイルを移動して空き容量を増加してから
.NET Framework 3.0 Runtimeをインストールして、どうにか↓のサンプルスクリプトを動かすことができました。
ただあまりにも起動時間が長すぎるので、ngen installコマンドはやっておきました。orz
さて、今回のサンプルもボタンを1つだけ表示しますが、タイマーを使ってぐるぐる回り続けます。
これもBOM付きUTF-8形式のテキストファイルとして保存してください。
また、(1)のときのwpf.pyも必要です。
# BOM付きUFT-8で保存
# sample2.py
# [i] このスクリプトはSTAで実行される
import wpf
from System import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media import *
win = Window(Title=u'IronPythonとWPFの勉強', Width=400, Height=400)
layout = RotateTransform(CenterX=200, CenterY=100, Angle=0)
btn = Button(Content='ここをクリック!!', Width=240, Height=100, LayoutTransform=layout)
def receiver1(sender, e):
global d
print( '%d度でクリックされた!!' % (btn.LayoutTransform.Angle) )
d = -d
btn.Click += receiver1
win.Content = btn
from System.Threading import *
from System.Windows.Threading import *
# [i] 一応、ここではSTAの中でbtnオブジェクトのプロパティにアクセスしている
dispatcher = btn.Dispatcher
def handler(o):
btn.LayoutTransform.Angle += d
def callback(o):
# [i] callback関数はMTAスレッドの中で実行される
# [i] BeginInvokeからInvokeに変更
dispatcher.Invoke( DispatcherPriority.Normal, TimerCallback(handler), o )
d = 5
tmr = Timer( TimerCallback(callback), None, 1000, 50 )
Application().Run(win)
今回はprintを使っているのでipy.exeで起動します。
D:\temp>d:\IronPython-2.0A1\ipy.exe sample2.py
8年ほど前Javaで仕事をしていたときにJPython(当時)を使って以来のPythonなので、あまり詳しく構文を分かっていないのですが、
クラスのインスタンスを作るとき(コンストラクタを呼び出すとき)に「属性名=値,属性名=値, ...」という書き方ができるんですね。便利です。
Timerのインスタンスは「callback」関数を呼び出しますが、ここから直接btn.LayoutTransform.Angleプロパティを変更しようとすると「ハンドルされていない例外: System.InvalidOperationException: このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。」となるため、btn.Dispatcher.Invokeを使ってボタンを作ったスレッドで「handler」関数を呼び出しています。
さて、このサンプルはEfficeonのモバイルノートPCでも動きました。
このPCにはWindows SDK for Vistaが入っていませんから、.NET Framework 3.0 RuntimeとIronPythonさえあれば、WPFを使ったプログラミングが可能になるはずです。
でも、WPF関連クラスのオフラインドキュメントはWindows SDK for Vistaに含まれていますから、
結局これも入れないとプログラムを作ることが出来ないわけですね。
もうHDDの空き容量がorz
やっぱりVAIO typeT(TZ)が欲しいな~