Programming」カテゴリーアーカイブ

プログラミングの良さげな Q&A サイトめっけ

最近 PyGtk ネタを書いていないので。
ちと海外を探していて良さげな Q&A サイトを見つけた。
プログラミング系全般を扱っているがタグで分けているので解りやすい。

Stack Overflow

Python だけで現在 15,000 もあるし PyGtk だけをタグから探すことも可能。

Hottest ‘pygtk’ Questions – Stack Overflow

全体的に Windows 環境でのことが多いのは当然だよと。
ついでにソコを見ていて見つけたんだが。

GNOME

busybox.py のコードに衝撃!こんなことができたんだ。

busybox

それと pygtk-docs.tar.gz を展開すればローカルでドキュメントが見られる。
今まで Web で全部読んでいたから軽い local で観覧できるのは嬉しいよ。
実は Fedora ならデフォルトで DevHelp にコレは入っているんだけーが…

local_manual

ところで pygoo って何?と思ったので探してみたけど

pygoo – Project Hosting on Google Code

利用したい人っているのかなぁ…
標準オブジェクトを継承して自分で拡張できなきゃ小物すら作れないと思うんだが。
上記の busybox.py を見て本当にそう思う。

Own class library to use from IronPython

IronPython を日本で検索すると C# から IronPython を使う方法ばかりだ。
GTK+ における PyGtk のように皆が使ってくれるだろうとか考えているのかな?
Windows ユーザーがそんなことをするとでも思って…(略
Windows 用オンラインソフト作者をやれば解るって…

よし。
逆に C# で作った自作クラスライブラリを IronPython から使う方法でもやるか。
需要が微妙であるのは気にしない、どうしてもそうしたい場合もあるヤン!

とりあえず Visual Studio でテキトーなクラスライブラリを作る。

using System;

namespace ClassLibrary1
{
    public class Class1
    {
        public static bool ChangeText(out string s)
        {
            s = "Change";
            return true;
        }
    }
}

classlibrary_build

意図的に out を利用している。
IronPython で ref や out を利用するにはこう書く解説も兼ねている。
下記サイトが色々と参考になることを書いてくれてているよと。

Dark Corners of IronPython

んでソレをコードと同一ディレクトリに置く。
肝心なコード。

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

import clr
clr.AddReference("ClassLibrary1")
import ClassLibrary1

result, value = ClassLibrary1.Class1.ChangeText()
print result
print value

cs_lib.zip

cs_lib_py

という感じで利用できます。
サードパーティ製や自作のライブラリが使いたい場合にコレでなんとかなると思う。

IronPython 2.6 Final

知らない間に IronPython 2.6 が Final になっていた。

IronPython

試してみたけど RC3 と違いが解らない。
msi 版に含まれる Python Module も RC3 と同じみたいだし。
つか

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

# python Module
import os
import zipfile

# .NET Framework
import System

dir_path = r"C:\Users\sasakima-nao\Documents\_temp"
filename = r"mpl_u160_x64.zip"

path_a = os.path.join(dir_path, filename)
print path_a
print os.path.exists(path_a)

path_b = System.IO.Path.Combine(dir_path, filename)
print path_b

zip = zipfile.ZipFile(path_b)
for f in zip.namelist():
    System.Console.WriteLine(f)

ironpython26test

Module 同梱になったのおかげでどっちでも良くなったのが少し変な気分。
どちらで書くか迷う、Python らしくないとか言う人が出るかもね。

IronPython への関連付け

Windows 7 を Linux の GNOME のように便利に使いたい、その2。

Windows でスクリプトを使うのに Linux に比べ何が不便なのか。
書くまでも無い、実行パーミッションという概念が無いこと。
すべてが拡張子による関連付けで決まってしまうこと。

特に普通の Python はインストールで *.py に関連付けられるので悲惨。
ファイルをうっかり W クリックすると無意味に cmd.exe コンソールが出る。
ま、インストールする気は無いけど、Windows では何の約にも立たない。

Windows 版 Python はその辺りを考えてか Pythonw という exe が同根されている。
コンソール不要なら拡張子を *.pyw にすればいい、だけどそれだけだ。
何より Windows ではコンソールなんてほとんどの人が使わない。
IronPython にも同様に ipyw(64) という exe が同根されている。

ipyw64

しかしよく考えてみれば私の Y901x や SeeMe も実行パーミッションは付けていない。
同根のシェルスクリプトからメインファイルを Python に引渡しているだけ。
ならば ipyw64.exe を利用して同じようにすればいいんでないの?

ということで考えた。

*.py をテキストエディタに関連付け
*.pyw を ipyw64.exe に関連付け(私の Windows 7 が 64bit なので)

というくだらない方法だがこれで Linux で Python を使っている時と同様に使える。
実行はシェルスクリプトの変わりに ipyw64.exe にやってもらおうという考え。

main_window.py

# -*- 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 *
from System.Windows.Media.Imaging import *

class PicViewWindow(Window):
    def __init__(self):
        self.Title = "PicView"
        self.Drop += self.on_drop
        self.AllowDrop = True
        self.Width = 300
        self.Height = 300
        self.image = Image()
        self.Content = self.image

    def on_drop(self, sender, e):
        filename = e.Data.GetData(DataFormats.FileDrop)[0].ToString()
        self.image.Source = BitmapImage(Uri(filename))

def main():
    Application().Run(PicViewWindow())

if __name__ == "__main__":
    main()

picview.pyw

import main_window
main_window.main()

という2つのファイルを用意し上記関連付けを行っておく。
picview.pyw を W クリックしてみる。

ipyw_picview

ということができる。
main() という関数を用意するのがミソ。
debug 時は EmEditor 等テキストエディタの機能で以下のように実行できるから。

ぱぇぽぃ2 ? Blog Archive ? EmEditor を Gedit 風にカスタマイズ

これでコードを編集したい時は *.py 実行時は *.pyw を W クリックという環境完成。
アイコンが違うので解りやすいしこのほうがコード分割も行いやすい。
ただ OS デフォルト動作では無いので配布に関してはどうするかだ…

P/Invoke CharSet.Unicode

間違いに気づいたまま放置はアレなので書き換えた。
しかし SHGetFileInfo C# なんかでググると笑った、皆 SHFILEINFO の第二引数が IntPtr だ。
32bit でしか動作確認していないんだねぇ、私もそうだったけど。

ついでに P/Invoke で SHGetFileInfoW の UNICODE 関数化したんだけど…

C# で SHGetFileInfo を使ってアイコンと種類を取ってくる例

SHGetFileInfoW てか UNICODE を P/Invoke で指定するにはこんなに面倒なのか!
CharSet = CharSet.Unicode を指定しなければ Ansi 関数呼び出しになってしまうのかい。
更に Ansi 文字列に変換を全自動で行うなんて今の時代としては逆だと思うんだが。

ぱぇぽぃ2 ? Blog Archive ? UNICODE にならん

を以前自分でやっていなかったら気がつかなかったかもだよ。
前回書いたように IronPython なら関数名直で str をそのまま渡せばいいだけなのに。

てか .NET Framework 2.0 からは XP 以降でしか動かないのにこの仕様…
Microsoft がやっていることは本当によく解らない。