2008年9月26日金曜日

PyQt4 win32 環境設定

PyQt4 win32 環境設定

Windows XP
Python 2.5 (win32)



PyQt-Py2.5-gpl-4.4.3-1.exe (Riverbank)

をインストール(ダブルクリックするだけ)する、だけ。で、デモが動くので、うまく行ったのだと思います。
コンパイル済みの SIP も Qt(Trolltech) runtime も入ってるので、文字通り、Python 本体以外は、本当に全部込みのパッケージでした。コンパイルなどの作業はありません。

Example フォルダ tutrial の E1 から E12 は Trolltech の Qt 大砲ゲームの C++ を Win32 Python で書き直してあるので、最後の行をコメントアウトすると Idle でも、そのまま実行できます。
最後の行がなんかエラー起こす理由が分からないのは、ただただ、私の勉強不足ですね。

ドキュメントは Unix/Linux 用のまま、なので、そのまま打ち込んでも動かない例もあります。
sys OS とか、その辺のちがいは、このE1-E12 よく見るとなんとなく分かるような、分からないないような。


さて、PyQt4 に決めたのは、とりあえず手数を少なく「Init、Start、Abort」程度のボタンを持つ 小さい GUI を今作るには、一番近道だったので、そうしたのです。
たかがそれだけのために、改めて .NET framework を機嫌よく動いてる XP にインストールする気にもなれず WxPython は外しました。

でも将来本気で GUI カリカリ攻めたい人には wxPython の方がいいかもしれません。(いや、それ以前に Python より Ruby にすべきかもしれません)
Qt がライセンスで、もめてる間に市民権を得た wx の方が文献やネット上の資料も多いし。

それだけではなく Enthought Python も現状 wxPython です。勢いが違います。
まぁ、Qt wx 両方入れることも出来るでしょうから(想像)時間があるうちに、ちまちま試すつもりです。

充分楽しんだら、Enthought Python を買うと思います。
今はなんとか、個人で把握できてますが、近い将来バージョンあわせのパニックになるのは目に見えていますので。


追記: Qt やめて Wx にします。 .Net は Agilent の I/O 何とかをインストールした時点で自分の PC に入っているようでした。ごめんなさい。

2008年9月25日木曜日

PyQt4 参考文献

  • Rapid GUI Programming with Python and Qt

GUI を何らかの方法で、ということで、いろいろ考えましたが Qt にしました。PyQt4 で行きます。
追記:やめて WxPython にします

Free ebooks からダウンロードしました。広告多いです。
Windows, Python, Qt の環境設定の方法などが、事前に読めて助かりました。

すぐ切れるかも知れませんが、直リンク。きれたら消します。
http://knowfree.net/2008/02/29/rapid-gui-programming-with-python-and-qt.kf



SRA さんの Qt Whitepaper の日本語訳も助かります。

  • Qt 4.3 Whitepaper/日本語 PDF


気をつけないといけないのは、 多くのドキュメント、Help が
 Qt はC++ を前提にしている。
 QtPy も Linux を前提にしている。

その中から、Windows Python で Qt の情報をさがすのに手間がかかります。
自分が変なことをしようとしている、という認識を持って慎重に行きましょう。

2008年9月23日火曜日

Python から ctypes で .dll を使う

ctypes で .dll を使う

Python でプリンターポートを制御する方法、その2
io.dll という、プリンターポートを制御するダイナミックリンクライブラリ、を Python から利用して LPT ポートの各信号を制御します。
もちろん Windows XP です。

Python2.5 の標準 ctypes モジュールを使います。
2.4 以前の Python から使うには win32all を別途インストールして ctypes モジュールを用意します。

io.dllGeekhideout からダウンロードして \windows\system32 のフォルダにコピーします。

動作確認、とアドレスの確認のために 同じく Geekhideout から parmon.exe をダウンロードして実行します。parmon.exe と以下の Python コードは同時に実行できます。シリアルポートと違って緩いようです。

事前に parmon.exe を実行して、parmon からパラレルポートのアドレスをもらいます、自分の目で読みます。parmon.exe に表示されている 16進数のプリンターポートのアドレスをそのまま利用して動作確認をします。

サンプルのコードは
  1. ctypes モジュールをインポート
  2. port にプリンターポートのアドレスを 16進数で設定(0x:ゼロエックス) 378 は parmon で表示された私のPCのプリンターポートのアドレスです。
  3. data にデータを 16進数で設定(0x) 00 (ゼロゼロ) で D0-D7 を全て Low レベルに
  4. ctypes の windll で IO.dll の PortOut を使い 2. のport(ポート) に 3.のdata(データ)を出力します。
  5. 書き込んだ値を表示(10進)
  6. キー待ち、で一時停止

-------

from ctypes import *

port = 0x378 # in Hex, 0x3BC
data = 0x00 # in Hex, 0xAA 0x55 0xFF

windll.io.PortOut(port,data)
print 'data = ',data

raw_input()

-------

data を適当に AA とか 55 とかにも変えて、parmon.exe で状態が変わるのを見て下さい。
io.dll の使い方(下のほう)に、 C から呼び出すサンプルとか VB から使うサンプルがあります。
PortOut 以外にも PortIn とか色々あって便利です。

真面目に使うには、データタイプをあわせる (argなんとか) とか、あるらしいのですが ctypes は上手にこなしてくれるので任せます。これは Windows だけの特権だそうです。うれしいかぎりです。

データの読み込みを行うと、下位 8bit の上にどこから来たの分からないデータがありますので、ビット演算でマスクすると使いやすいデータになります。こんな方法で本当にいいのか、は分かりません。。。


この方法で、Km2Net さんの USB-IO を バケさんの vbausbio.dll を利用して制御すること、等も出来そうです。買って確かめたら、報告します。