投稿

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

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

PHP で Django の paginator 的なもの

PHPで Django 的なページング処理。 http://gist.github.com/116097 。 $page = new Page($publisher->books, 10); for($i = $page->start_index(); $i <= $page->end_index(); $i++) { $page->number = $i; $books = $page->get_page(); print $publisher->name; foreach ($books as $book) { print $book->title; } } みたいな使い方。

pyAWWS バグ対応とか

Sekimura さまより、pyAWWS のパッチを送っていただきました。ありがとうございます!初歩的なバグでした・・・。送っていただいたパッチは http://gist.github.com/114552 です。さっそく当てたものを コミット しました。 バグはあんまほめられたことじゃないですけど、パッチ送ってもらうのはうれしいもんですねw

pyAAWS for Product Advertising API

Python library of Amazon Associates Web Service を Product Advertising API に対応させました。電子署名とか・・・。追加点は新API仕様のとおりです。解説がめんどいので、diff 貼ります。 +import hashlib +import hmac +import base64 -Version = '2009-02-01' +Version = '2009-03-31' def _get_url(self, kw): - url = 'http://%s/onca/xml?Service=%s&AWSAccessKeyId=%s&Version=%s&' % ( - supported_locales[self.locale], - Service, - self.AWSAccessKeyId, - Version, - ) if not kw: kw = {} + kw['Service'] = Service + kw['Version'] = Version + kw['AWSAccessKeyId'] = self.AccessKeyId + kw['Timestamp'] = datetime.datetime.utcnow().isoformat() if (not 'AssociateTag' in kw) or (not kw['AssociateTag'] and self.AssociateTag): kw['AssociateTag'] = self.AssociateTag if (not 'MerchantId' in kw) or (not kw['MerchantId'] and self.MerchantId): kw['MerchantId'] = self.Merch...

Python library of Amazon Associates Web Service

Python library of Amazon Associates Web Service を公開しました。既存で pyAWSというのがあるみたいですが、正直使いにくかったので、自分用に作成しました。Google App Engine に乗っけたかったので、Pure Python で dom をパースできる pxdom を同梱してます。もち、xml.dom.minidom でも動作します。APIのバージョンは、いまんとこ最新の "2009-02-01" です。とりあえず、ItemSearch の機能しかありません。 import aaws api = Api('1MGVS72Y8JF7EC7JDZG2') items = api.ItemSearch('Python', SearchIndex='Books', ResponseGroup='Small') print '%s' % items.url print 'TotalResults: %s' % items.count print 'TotalPages: %s' % items.num_pages print 'ItemPage: %s' % items.number for item in items.object_list: print ' * Title: %s' % item.Title if item.has_next() next = items.next_page_number() items = api.ItemSearch('Python', SearchIndex='Books', ResponseGroup='Small', ItemPage=next) という使い方ができます。とりあえず、結果のクラスは paginator と互換性を持たせているので、ある程度直感的に使えるかもと期待w。Amazonで遊ぶアプリを作っているので、今後 ItemLookup 等のAPIも追加していく予定(いつもながら亀のスピード)。コードはいつもながらひどいと...

DjangoのModelで複数のフィルターを利用する場合のTips

id:Voluntas が、早速コードレビューしてくださった。6つぐらいるけど、今日はとりあえず、Modelのリファクタリングのアドバイスを実装した。diffは ここ 。 timeline = Timeline.all() timeline = timeline.filter('author =', user) timeline = timeline.filter('group =', group) と今まで書いていたけど、Pythonは長いコードを' \ 'を使って改行できる。それを利用し、Modelで複数のfilterを利用する場合でも以下のように書く。 timeline = Timeline.all() \ .filter('author =', user) \ .filter('group =', group) 他にも色々とアドバイスを頂いているので、コードを見やすくしていくことにする。 Special thanks voluntas.

GAWare 公開

AppSpotで公開している GAWare のソースコードをGPLライセンスで公開し始めました。コメントを入れたやつから公開していきます。コードが長いし、読みにくいですがご容赦ください(汗)。まだスラグ用の正規表現フィールド等はデバッグしてません…。コードレポは迷ったんですが、 Google Code を使っています。そのうち、bitbucketあたりに移行するかもしれません。バグとか、コーディングのアドバイス等色々突っ込んでいただけると喜びます。

Subversion削除用バッチファイル

Subversionを使ってると、.svnっていうフォルダが生成されちゃいますね。.svnファイルを一括で削除するバッチファイルを置いておく。ソースファイルを納品する時とかに、一気に.svnを削除して納品する時に使ってる。[filename].bat(バッチファイル)っていう名前で保存して、削除したいフォルダの最上位において実行すると、下位フォルダを含むすべての.svnファイルを削除してくれます。 echo off for /r %%i in ( .svn ) do ( if exist "%%i" ( rmdir /s /q "%%i"))