投稿

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

Python で Windows のプリンタスプールを削除する

Windows XP で印刷をキャンセルしたり、印刷キューに残っている印刷ジョブを削除したりする方法 (KB946737) のメモ import os import win32serviceutil # スプールファイルの保存先 spooled_dir = os.path.join( os.environ.get('SYSTEMROOT', r'C:\WINDOWS'), 'system32', 'spool', 'printers', ) win32serviceutil.StopService('spooler') for f in os.listdir(spooled_dir): os.remove(os.path.join(spooled_dir, f)) win32serviceutil.StartService('spooler') StopService の後もプロセスがしばらくファイルをつかんじゃって消せない場合もある

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...