[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)