投稿

8月, 2010の投稿を表示しています

PyQt でクロスプラットフォームなデスクトップアプリケーションを

ここ何ヶ月かデスクトップアプリケーションにどっぷりな感じです。パッケージングをもっと簡単にしたい!ということで色々と試行錯誤しておりました。linux, mac はいい感じですが、Windows は・・・ py2exe でフリージングのみしかしていませんでした。配布とインストールは自動解凍書庫、アップデート、アンインストールは・・・。そこで今回 (やっと) 覚えたのが Inno Setup や WiX といった Windows 用のパッケージビルダです。備忘録がてら、Python でのパッケージングをまとめてみました。 パッケージングについて 大きく 2 つのフェーズに分かれています。 フリージング: Python バンドルや他の必要なライブラリーを寄せ集め、実行可能形式にまとめます。 Windows と OS X については以下のライブラリでフリージングします。 Windows 用: py2exe OS X 用: py2app Linux を含むクロスプラットフォームなフリージングができる cx_Freeze というのもあります。 ディストリビューションのビルド Windows: Microsoft Windows Installer はアップグレード、アンインストール、トランザクション処理を使った複数パッケージの管理とかの便利機能を持っています。 WiX ( Wikipedia ): MSI 形式でビルドするための MS 製のオープンソースツールです。WXS という XML ファイルを作成し、それを元にビルドします。 Inno Setup ( 日本ドキュメント ): Windows インストーラ (Setup.exe) を作成するオープンソースツールです。Delphi で書かれています。 NSIS ( Wikipedia ): 多機能。スクリプト駆動型のWindows用インストールシステム。Mozilla, Google, BitTorrent などにも使われています。 他にもあるかもです。 OS X: hdiutil : py2app でできた *.app を *.dmg にしてくれるらしいです (使ったことありません)。 クロスプラットフォームな setup.py の書き方 Windows

PyQt を py2exe でフリージング

標準的なフリージング # setup.py import py2exe from distutils.core import setup py2exe_options = { "compressed": 1, # 圧縮する "optimize": 2, "bundle_files": 3, "includes" : ["sip",] } setup( options={"py2exe" : py2exe_options}, windows=[{"script" : "main.py"}], # PyQt ファイル zipfile="[zipped.lib ファイル名]", ) 私の環境 (XP, Py2.6.4) では、 py2exe_options の bundle_files は 3 (分割ファイル) じゃないと動作しませんでした。 jpeg や gif 等の画像を取り扱う場合 PyQt は bmp や png 以外の画像形式を標準でサポートしていません。その他のフォーマットはプラグインとして提供されています。プラグイン (dll) をフリージングしたファイル配下のディレクトリーに保存する必要があります。 # setup.py import os import py2exe from distutils.core import setup # 任意のフォーマットの dll を追加。特にアイコンは必要かも IMAGELIB_DIR = r"C:\path\to\python\Lib\site-packages\PyQt4\plugins\imageformats" imgfiles = [os.path.join(IMAGELIB_DIR, i) for i in [ "qgif4.dll", "qico4.dll", "qjpeg4.dll", "qmng4.dll",

Python から Win32 API 経由で印刷する

Win32 API から印刷をするためには、プリンタデバイスコンテキスト (Printer DC) を利用します。具体的には以下のような順序で印刷します。 プリンタドライバからハンドルを取得する プリンタドライバのステータス API から印刷可能か同かを取得する プリンタデバイスコンテキストを作成する ドキュメントを開始する 必要であればフォント等を設定し、印字、改ページ処理などをする ドキュメントを終了する (この時点でプリンタスプールサービスに登録されるようです) プリンタデバイスコンテキストを開放する プリンタドライバのステータス API を監視し、印刷が正常に終了したかを取得する プリンタドライバのハンドルを解放する 太字の手順 (3 - 7) は Win32 API で共通ですが、それ以外の手順 (1, 2, 8, 9) はプリンタドライバに依存しているため、Python から制御したい場合はライブラリを作成する必要があります。これについては、ドライバマニュアルとにらめっこしながら ctypes.windll でがんばります・・・。プリンタ接続、用紙切れ、ミスフィード等のプリントエラーを制御する必要がなければ、書く必要はありません (排他制御が必要なプリンタを除く)。プリンタドライバ毎に変わる部分は置いといて、太字の Win32 API の部分の覚書です。 プリンタデバイスコンテキストを作成する import win32ui import win32con PRINTER_NAME = '[コンパネ -> プリンタとFAX -> に登録しているプリンター名]' PIXELS_PER_INCH = 1440 # 1 インチ毎のピクセル数 INCH_PER_POINT = 72 # 1 インチ毎のポイント数 SCALE_FACTOR = int(PIXELS_PER_INCH / INCH_PER_POINT) # わざわざ計算せず 20 と指定する場合が多い dc = win32ui.CreateDC() dc.CreatePrinterDC(PRINTER_NAME) # 指定したプリンタ名のプリンタデバイスコンテキストを作成する self.dc.SetMapMode(win32con.MM