IronPython」タグアーカイブ

IronPython CRLF

Glade の覚書がちっとも進まない。
やっぱり普段使わないものの覚書って無理があるかも。
ということで Blog でやった IronPython ネタを地味にまとめている。

覚書のページ – L’Isola di Niente

つまりほとんどコピペ、でコードが IronPython 2.6 でキチンと動くか確認してみたんだが
IronPython の \n が CR/LF になるんだが…
以前は LF のみだったような気がするんだけど違ったかな。

追記

まてよ、もしかして System.IO と組み込み open では扱いが違うのかな?
というより IronPython では内部で \n はどう保持されているんだろう?
気になったのでテストコードを作って試してみた。

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

import System

crlf_test = "a\nb"

# Inside is \n==LF
bytes = System.Text.Encoding.UTF8.GetBytes(crlf_test)
for i in range(len(bytes)):
    print bytes[i]

# The following code is \n==LF write
sr = System.IO.StreamWriter("test1.txt")
sr.Write(crlf_test)
sr.Close()

# The following code is \n==CR/LF write
f = open("test2.txt", "w")
f.write(crlf_test)
f.close()

やはり open() で書き込む時にのみ LF を CR/LF に変換しているようで。
標準 Python モジュールの関係あたりで CPython に無理やり合わせたのだろうと憶測。
以前は LF のみだったような気がしたのはコレに気が付かなかっただけかな。

ついでだから C# での内部も一応探ってみる。

using System;

class Program
{
	static void Main(string[] args)
	{
		System.Byte[] bytes = System.Text.Encoding.UTF8.GetBytes("a\nb");
		foreach(System.Byte b in bytes)
		{
			Console.WriteLine(b);
		}
	}
}

当然のように LF に、つまり .NET Framework なら内部では cli 仕様の \n==LF である。
注意しておかないとハマるかも。

Mobile is Mobile

【PC Watch】 マイクロソフト、アーチ型デザインの無線キーボード「Arc Keyboard」

ムムッ!この矢印キー的な発想は無かった。
Aspire 1410 での矢印キー操作に「五万円も出したのに…」な人って私以外にも多いかな?
ネットブックでは性能で元(満足度)が取れないのは解っていたけど CULV でもやはりキー配置がアンマリだ。

ということで無線キーボードを探してみたんですけど。

でも Home や PageDown キーがココってどうなのだろう?
一般人はテンキーをどうだなんて解っています、私基準で書いたら得に Home キーが気になる。
Home や PageDown がこの位置では更に「フザケルナ!」になりそうな悪寒。
フルキーボードって恐るべきそのままの理由で「フル」だと、単独キーでイケルのだから。

だからフルキーボードで使っている Linux ばかり利用するんだよね。
Mobile は結局 Mobile である。
Windows 自身が Linux より色々面倒なのもあるが CLUV はメインで使うには厳しい。

Apple Wireless Keyboard Helper for Windows – misuzilla.org

IronPython 屋ならこの「デフォルトのスクリプト」をクリックして見てくれ。
なんだよ、IronPython で実用的な拡張を実践している人が本当にいるんだ。
おんぶなアプリは親の仕様変更にだっこされる運命、カワイソ(略
でもこの公開スクリプトは色々と参考になるぞと。

IronPython True False

Python の True, False は変数みたいなものであるのは有名。
True が 1、False が 0 な整数という解釈でいいのかな。

>>>True + True
2
>>>True + False
1

まてよ、IronPython ではどうなのかな?
CTS により .NET の型にマッピングされなければいけないはずなんだが。

と思ったので少し試したけど整数等と同じ、つまり普段は Python の型である。
clr か System を import すると「どっちでもいい」オブジェクトに変身する。

>>>import System
>>>System.Boolean.Parse("true") == True
True
>>>True + True + True
3

又、変数?なので

>>> True = "abcde"
>>> True
'abcde'
>>> True + True
'abcdeabcde'
>>> System.Boolean.Parse("true") == True
False
>>> 2 == 2
True

真ならやはり True が戻ってくるけど中身は文字列というワケワカなことにも。
ま、普通は True や False に代入するはずがないから気にしなくてもいいんだが。

ついでに、どこかで null は IntPtr.Zero だとか見かけたけど

全然違う、None で大抵イケるはずだが None のマッピングは何だろう?

IronPython IDisposable and Python Context Management

What is the equivalent of the C# “using” block in IronPython? – Stack Overflow

IronPython で using てか IDisposable が利用できたんだ。
知らなかった、てゆーか with, as って何だ?
私が買った Python の本にはこんなの書いていなかった気がするんだが。

with – odz buffer

Python 2.5 以降で使えるらしい、IronPython だけというわけでは無いようで。
やっぱり知っている人は少ないのか、もう少し調べてみよう。

3.10 コンテキストマネージャ型

__ext__ 指定だけだと例外になった、__enter__ と常に対にする必要あり。
試しに何か書いてみよう、と思ったけど IronPython で思いつかなかった(ぉい!

で、PyGtk の gtk.MessageDialog は destroy() メソッドを呼ぶ必要があるので

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk

class MessageBox(gtk.MessageDialog):
    def __init__(self, parent=None, flags=0, type=gtk.MESSAGE_INFO, 
                  buttons=gtk.BUTTONS_NONE, message_format=None):
        gtk.MessageDialog.__init__(self, parent, flags, type, buttons, message_format)
    def __enter__(self):
        #print 'enter' # debug
        return self
    def __exit__(self, *excinfo):
        #print 'exit %s' % repr(excinfo) # debug
        self.destroy()

def messagebox(text):
    with MessageBox(buttons=gtk.BUTTONS_OK, message_format=text) as dlg:
        dlg.run()  

messagebox("Test !")

おぉ!確かにこれで解放処理を書かずに関数が使える。
でも try, finally のほうが解りやすいと思うんですけど…
組込みなら使うけど自分で書くかは少し微妙。

DataBinding Compare Code and XAML

IronPython にて WPF の DataBinding をコードで行う方法が解らなかった。
ElementName をコードで書き込んでも反映されないし。
ということで毎度のように検索、C# コードなら日本語で見つかるから便利だね。

[WPF][C#]Bindingでくっつけてみよう その1

コードで行うには Source Property か DataContext を利用すればいいのか。
XAML を含めて IronPython でやってみよう。

Source Version

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

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *

class DataBindingTest(Window):
    """
        Source Version
    """
    def __init__(self):
        # Create Controls
        textbox = TextBox()
        textblock = TextBlock()
        # Append
        stackpanel = StackPanel()
        stackpanel.Children.Add(textbox)
        stackpanel.Children.Add(textblock)
        self.Content = stackpanel
        self.SizeToContent = SizeToContent.WidthAndHeight
        # Binding
        binding = Data.Binding("Text")
        binding.Source = textbox
        textblock.SetBinding(TextBlock.TextProperty, binding)

if __name__ == "__main__":
    Application().Run(DataBindingTest())

DataContext Version

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

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *

class DataBindingTest(Window):
    """
        DataContext Version
    """
    def __init__(self):
        # Create Controls
        textbox = TextBox()
        textblock = TextBlock()
        # Append
        stackpanel = StackPanel()
        stackpanel.Children.Add(textbox)
        stackpanel.Children.Add(textblock)
        self.Content = stackpanel
        self.SizeToContent = SizeToContent.WidthAndHeight
        # Set DataContext
        self.DataContext = textbox
        # Binding
        binding = Data.Binding("Text")
        textblock.SetBinding(TextBlock.TextProperty, binding)

if __name__ == "__main__":
    Application().Run(DataBindingTest())

XAML Version

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

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System.Windows import Application
from System.Windows.Markup import XamlReader

xaml = """<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    SizeToContent = "WidthAndHeight">
    <StackPanel>
        <TextBox Name="_tname" />
        <TextBlock Text="{Binding ElementName=_tname, Path=Text}" />
    </StackPanel>
</Window>"""

w = XamlReader.Parse(xaml)
Application().Run(w)

どれでも結果は同じ、TextBox に書き込んだ文字列がそのまま TextBlock に。
DataContext はバインディング元データが一つなら問題無いだろうけどチト怖いかな。

というより、やはりこういうのは XAML が一番解りやすく書けますね。
用途によってコードにするか XAML にするかで選べばいいことだけど。