IronPython は親クラスの __init__() がいらない

.NET Framework について何を今頃知ったのだが…
StreamWriter はエンコード指定をしなければ BOM 無し UTF-8 になるらしい。

ま、元々 Opera は付けていたのでSeeme for Linux の場合は問題無いのだが。
UTF-8 を指定すると BOM が付いて困ることがあったので理解しておかなきゃ。

てなわけで実際そうなのか実験コードを IronPython と WPF で書いてみたのだが…
突っ込みどころ満載になってしまった。

# -*- coding: UTF-8 -*-

import clr
#import nt

# 最小限下記ライブラリ(dll)が必要
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media import *
from System.IO import *

class UTF8Writer(Window):
    """
        System.IO.StreamWriter の実験
        何も指定せず書き込みすると BOM 無し UTF-8 になる
    """
    def __init__(self):
        """
            IronPython では Window.__init__(self) はいらないようです
            書いても例外にならないけど
        """
        self.Title = "UTF-8 書き込みの実験"
        self.textbox = TextBox()
        self.textbox.TextWrapping = TextWrapping.Wrap
        self.textbox.AcceptsReturn = True
        self.textbox.FontFamily = FontFamily("MS ゴシック")
        # ボタン作成及びクリックハンドラ登録
        button = Button()
        button.Content = "書き込み"
        button.Click += self.onClick
        # StackPanel だとサイズ連動ができないので DocPanel を使う
        # けど何故 static なんだ!
        DockPanel.SetDock(button, Dock.Top)
        # レイアウタを作成してこれらをセット
        dp = DockPanel()
        dp.Children.Add(button)
        dp.Children.Add(self.textbox)
        # レイアウタを Window にセット
        self.Content = dp
        self.Width = 320
        self.Height = 240

    def onClick(self, sender, e):
        """
            流石に以下はできない、nt.path が無い…
            sw = StreamWriter(nt.path.dirname( __file__ ) + "\\put.txt")
        """
        sw = StreamWriter("put.txt")
        try:
            buf = self.textbox.Text
            sw.Write(buf)
        except Exception, ex:
            MessageBox.Show(ex.Message)
        finally:
            sw.Close()

class UTF8WriterCopy(UTF8Writer):
        """
            自作クラスでもコレでイケる、なんか変
        """
        pass

if __name__=="__main__":
    a = Application()
    a.Run(UTF8WriterCopy())

writer

なるほど、BOM 無し UTF-8 になることは確認できた。
XP 用の WPF にはフォントにアンチエイリアスを掛けるのをヤメてくんないかなぁ。

つーかナンジャコレ。

今まで気がつかなかったよ、親クラスの __init__ はいらないんだ。
Python じゃ無いヤン、コンストラクタになっているってことだよね。
それとも CLI の仕様なのかな?

更に気がつかなかったけど DockPanel へのレイアウトは static なんだ。
XAML で書いていると普通に見えるけどコードで書くと違和感がたっぷり。
GTK+ とは違ってパッキング情報は子オブジェクト側が持っているということか。

やりにくいのでコンテナの継承をして pack_start みたいなのを作ろうかな?
と思ったけど要求が StackPanel と DockPanel に分かれているし無理っぽい。
WPF は XAML で書くのを強要しているってことだろう多分。

os モジュールのクローン nt を作ったのなら nt.path も用意してくれよみたいな。

まだ気がついていないところってありそうだ。
IronPython は Python クローンだと思って書くと痛い目に遭いそう。
しかし例外の書き方なんかはまったく同じだ、逆に変な気分になった。