投稿

ラベル(gui)が付いた投稿を表示しています

WSGI on Qt (PyQt or PySide)

イメージ
こんにちは、Python 会の。。。思いつきませんでした。初 " Python Web フレームワーク アドベントカレンダー2010 " に参加させていただくことになりました。よろしくおねがいします。アドベントカレンダー参加者のブログは cielquis.net に綺麗にまとめられていますよ。 ごめんなさい。Web アプリケーションフレームワークの作成なんて 1 日じゃむりぽ><。メインで使ってるフレームワークは、 Django か webapp ぐらい。。。最近 dis られてるので、Django 記事書くのもあれだ・・・。 ということで本題です。Python は WSGI (Web Server Gateway Interface) という Web アプリケーションと Web サーバ間の共通インターフェースがあります。そのインターフェースを実装したオブジェクトは、Web アプリケーションとして動作させることができます。ということで、デスクトップアプリケーションを Web アプリケーションにする方法を書きたいと思います。今回は Qt の Python binding な PyQt / PySide で WSGI アプリケーションを作ってみたいと思います。実装は PySide ですが、 PyQt でも動くはずです。 STEP1: PySide で Hello World! ほんと Web アプリケーションじゃなくて申し訳ないですが、最初に PySide で "Hello World!" を表示します。 import sys from PySide import QtCore, QtNetwork, QtGui class QWSGILabel(QtGui.QLabel): def __init__(self, text, parent=None): super(QWSGILabel, self).__init__(text, parent=parent) class QHttpWidget(QtGui.QWidget): def __init__(self, parent=None): super(QHttpWidget, self).__init_...

PySide for Windows

イメージ
PySide の Windows 版が公開 されました。PySide は Qt (Nokia 製のクロスプラットフォームな GUI ツールキット) の Python binding です。もともと Qt の Python binding は PyQt というのがありました。Qt のライセンスは 4.5 から GPL / LGPL / 商用ライセンス ( 日本での価格 ) になったのですが、PyQt の ライセンス は GPL / 商用ライセンスとなっています。商用ライセンスで使うためには、けっこう高いお金を払わないといけないです。GPL だと、PyQt を利用するすべてのアプリケーションは GPL にしないといけません。ML で "金を払うから LGPL にしろ!" と言ってる方もいらっしゃいましたね。でもいろいろと難しかったようで、Qt 作者の Nokia さんが LGPL 対応の Python binding をフルスクラッチしたのが PySide です。 さっそく開発している PyQt アプリケーションの branche を切って、PySide 化始めました。これを機に、もっと Qt と Python が流行ればいいと思います。 PySide for Windows な記事 philo 式さんのブログ Slashdot

pyqt4 の widget に マウスなイベントハンドラを追加する

qt では QLineEdit などの QWidget に デフォルトではマウスなイベントハンドラがないらしい。なので、clicked, pressed, released などを connect しても無反応です。もし、デフォルトの QWidget にマウスなイベントハンドラーを追加したい場合は、本家 ML に Widget のサブクラスを作ってフックしろとあった。 from PyQt4 import QtCore, QtGui class QLineEdit(QtGui.QLineEdit): def __init__(self, parent=None): QtGui.QLineEdit.__init__(self, parent) def mousePressEvent(self, event): self.emit(QtCore.SIGNAL("pressed()")) def mouseReleaseEvent(self, event): self.emit(QtCore.SIGNAL("clicked()")) self.emit(QtCore.SIGNAL("released()")) 乱暴ですが、上記のコードでデフォルトのイベントをハンドリングできます。 clicked については Press と Release を両方フックする必要があると書いてありましたけど、いつどこで押されて、何秒以内に離されたかとか厳密に制御されたい型は実装しちゃってください(笑 他にも Qt では、デフォルトのイベントで渡ってくる情報が少なかったりするので、サブクラスでフックしちゃってます。

PyQt4 の qtdemo を PyInstaller で実行ファイル形式にする

vcredist のインストール (インストーラー) "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_*" 配下に "msvcm90.dll", "msvcp90.dll", "msvcr90.dll" という dll が作成されている (フォルダが複数ある場合は最新のやつ) を、python path に複製する。 pywin32 のインストール (インストーラー) PyQt4 のインストール (インストーラー) PyInstaller のインストール これは svn から trunk をチェックアウトし、PATH に追加する svn co http://svn.pyinstaller.org/trunk/ pyinstaller-trunk PyInstaller の設定 python Configure.py さくっと demo を実行ファイル形式にしてみる (なんでもいい) cd \path\to\qtdemo\richtext\textobject Makespec.py -F -K -w textobject.pyw Build.py textobject.spec 実行するとメッセージがダーっと流れて、exe ファイルができる ... ... Appending archive to EXE C:\path\to\qtdemo\richtext\textobject\dist\textobject.exe 実行できるよ (textobject を実行するときは files ディレクトリを作成された exe がある dist ディレクトリ配下に複製してください)