[pukiwiki]
タイトルが長い。。。
ペイントツールのPixiaは使い慣れてるのですが、Vistaだと、よく落ちるのです(汗)
ということで、ほかのツールでも使えるように、ソフト標準形式のPXAで保存してあったデータをPhotoshopのPSD形式で保存しなおすことに。
変換作業自体はPixiaで行うしかないようですけれども、ファイル数が多いので、PythonのpyWinAutoモジュールを使い、作業を自動化することに。
-[[Pixia オフィシャルサイト:http://www.pixia.jp/]]
いつも使ってたペイントツール。
-[[pyWinAutoモジュール 配布サイト:http://pywinauto.openqa.org/index.html]]
pythonから、windowsソフトを自動操作するためのモジュール。
–[[SendKeysモジュール:http://www.rutherfurd.net/python/sendkeys/index.html]]
PythonからWindowspyWinAuto内から呼び出すので、あらかじめインスコ
-コロタエンヂニアリング
こちらが大変判りやすかったですー
–[[pywinautoのHowToの日本語訳の初校:http://d.hatena.ne.jp/dai_yamashita/20080421/1208777841]]
–[[「PyWinAuto」の検索結果:http://d.hatena.ne.jp/dai_yamashita/searchdiary?word=PyWinAuto]]
*今後使ってみたいモジュール
-[[pyHook:http://pyhook.wiki.sourceforge.net/]]
マウス、キーボードなどの入力イベントをフック。操作を記録するほうに使えそう。
-[[WATSUP – Windows Application Test System Using Python:http://www.tizmoi.net/watsup/intro.html]]
pyWinAuto的な別のモジュール
-[[Windows automation with Python:http://kvance.livejournal.com/985732.html]]
win32apiで直に。
*pyWinAutoで、ちょとだけ困ったこと
-便利すぎるので、悪用厳禁!!!
-自動操作するためのコードを書くのが、けっこう大変。操作を記録してくれるソフトが有ると助かるかも。
(RocketMouseみたく) 誰か作ってー
-SendKeyメソッド (sendkeyモジュール)は英語キーボード用。なので、日本語キーボードだと、コロンなどの記号がうまく入力できず。困った。
//-Firefoxは、画面のボタンを指定する名前が独特なので、どうやったらいいのかよくわかりませんでした
—-
以下コード。
あくまで自分用なので、タイミング等によっては、うまく動かないことがあります。
[/pukiwiki]
[pukiwiki]
//*こうすればRocketMouse的な何かも作れるかも
//と、思ったけど、やっぱりよくわからず。
//マウスのクリックだけをリアルタイムで記録 ->再生するソフトを考えてみますた。
//(まだ作ってないです っていうか、 ”誰か作ってー”
//-記録
//–一番上になってるウィンドウのハンドルを取得 (Hとします)
//–画面一番上に透明なウィンドウを表示
//–その透明なウィンドウへのマウスイベントを拾う
//–イベントを記録
//–ウィンドウHへとイベントを丸投げ
//–終わったら記録データを保存
//-適宜再生
//—-
[/pukiwiki]
# -*- coding: utf-8 -*- """Convert Paint tool Pixia (PXA ) to Photoshop (PSD) or PNG about Pixia Paint Tool http://www.pixia.jp """ import pywinauto import time import os from glob import glob from pywinauto.application import Application import sys from functools import partial prg=u"C:/フルパス/pixia.exe" dir_list=[ [u"C:/フルパス/pxaの有るフォルダ1", u"c:/フルパス/保存先1"], [u"C:/フルパス/pxaの有るフォルダ2", u"./保存先2"] #内部でフルパスに変換するので、相対パスでもOK ] #Pixiaを起動 app=Application() try: app.connect(title_re=".*Pixia.*") except: app.start(prg) def szwait(fn): last=0 for i in xrange(1000): time.sleep(1) print ".", sz=os.path.getsize(fn) if last!=sz : last =sz elif sz>0 : break else : raise Exception def wait_dlg(ttl,fnc=None): time.sleep(1) for i in xrange(100): time.sleep(.1) try: print ".", if fnc : fnc() dlg=app.window_(title_re=ttl) break except: continue else: raise Exception print return dlg def main(dir_list): for pxa_dir,save_dir in dir_list : print pxa_dir if not os.path.exists(save_dir): os.mkdir(save_dir) psd_dir=save_dir+"/psd" print psd_dir if not os.path.exists(psd_dir): os.mkdir(psd_dir) png_dir=save_dir+"/png" print png_dir if not os.path.exists(png_dir): os.mkdir(png_dir) loop2(pxa_dir,save_dir) def loop2(pxa_dir,save_dir): psdmask=os.path.abspath(save_dir+"/psd/%s.psd") pngmask=os.path.abspath(save_dir+"/png/%s.png") pxamask=os.path.abspath(pxa_dir+"/%s.pxa") pxalist=[os.path.abspath(x) for x in glob(pxamask %"*")] #ファイル名のボディ部のみに fnlist=["".join(os.path.split(i)[1].split(".")[:-1]) for i in pxalist] for fn in fnlist: pxa_name=pxamask % fn png_name=pngmask % fn psd_name=psdmask % fn cnv(pxa_name,[psd_name,png_name]) def psd_save(psd_name): "PhotoShop[*.psd]" dlg=wait_dlg("Pixia") dlg.TypeKeys("%FA") dlg=wait_dlg(u"名前を付けて保存") dlg.Edit.SetEditText(psd_name) dlg.ComboBox2.Select("PhotoShop[*.psd]") time.sleep(1) dlg.Button.Click() time.sleep(3) szwait(psd_name) def png_save(png_name): "PNG[*.png]" #PNG dlg=wait_dlg("Pixia") dlg.TypeKeys("%FA") dlg=wait_dlg(u"名前を付けて保存") #GUI部品の名前をダンプ。 #print_ctrl(u"名前を付けて保存") #raw_input("stop") dlg.Edit.SetEditText(png_name) dlg.ComboBox2.Select("PNG[*.png]") time.sleep(1) dlg.Button.Click() #透明情報保存 dlg=wait_dlg("PNG") #print_ctrl("PNG") app.PNG.CheckBox2.Check() time.sleep(.5) dlg.OK.Click() time.sleep(3) szwait(png_name) def cnv(pxa_name,save_list, sw={"png":png_save,"psd":psd_save} ): """コンバート本体""" not_converted=[] for fn in save_list : #print fn ext=fn.split(".")[-1] if not ext : raise u"save 拡張子を指定してください" if not os.path.exists(fn) : not_converted.append(fn) if not not_converted : return print pxa_name #コンバート元をロード dlg=wait_dlg("Pixia") dlg.TypeKeys("%FO") dlg=wait_dlg(u"ファイルを開く") print pxa_name dlg.Edit.SetEditText(pxa_name) dlg.Button.Click() #コンバート失敗してる場合もあるので、存在してるのも含め、全部コンバートしなおし #for fn in not_converted : for fn in save_list: print fn ext=fn.split(".")[-1].lower() if not sw.has_key(ext) : raise u"対応していない拡張子です" sw[ext](fn) #画像を閉じる dlg=wait_dlg("Pixia") dlg.TypeKeys("^W") #以下 オマケ extlist={ "bmp":"Windowsビットマップ[*.bmp]", "dib":"Windowsビットマップ[*.dib]", "eps":"Adobe EPS[*.eps]", "gif":"GIF[*.gif]", "ico":"Windowsアイコン[*.ico]", "jpeg":"JPEG[*.jpeg]", "jpg":"JPEG[*.jpg]", "png":"PNG[*.png]", "psd":"PhotoShop[*.psd]", "pxa":"標準[*.pxa]", "rgb":"フジフィルムベタファイル[*.rgb]", "tga":"Targa(TGA)[*.tga]", "tif":"TIFF[*.tif]", def print_ctrl(ttl): """GUI部品の名前をダンプ""" dlg=app.window_(title_re =ttl) dlist=dlg._ctrl_identifiers() for i in dlist: for j in dlist[i] : print j," ", print print "----" "tiff":"TIFF[*.tif]"} def dump_combobox(ttl): #あらかじめ、何らかの画像を開いておく dlg=app.window_(title_re =ttl) dlist=dlg._ctrl_identifiers() for i in dlist: if "ComboBox" in str(i): for j in dlist[i]: print j ," ", print print "----" for j in dlg[dlist[i][0]].ItemTexts(): print j #tlist=dlg.ComboBox2.ItemTexts() print "----" def dump(): dlg=wait_dlg("Pixia") dlg.TypeKeys("%FA") #名前を付けて保存 print_ctrl(unicode("名前を付けて保存")) dump_combobox(unicode("名前を付けて保存")) if __name__=="__main__": #dump() if len(sys.argv)==3: dir_list=[sys.argv[0],sys.argv[1]] main(dir_list)