タイトルが長い。。。
ペイントツールのPixiaは使い慣れてるのですが、Vistaだと、よく落ちるのです(汗)
ということで、ほかのツールでも使えるように、ソフト標準形式のPXAで保存してあったデータをPhotoshopのPSD形式で保存しなおすことに。
変換作業自体はPixiaで行うしかないようですけれども、ファイル数が多いので、PythonのpyWinAutoモジュールを使い、作業を自動化することに。
- Pixia オフィシャルサイト
いつも使ってたペイントツール。 - pyWinAutoモジュール 配布サイト
pythonから、windowsソフトを自動操作するためのモジュール。- SendKeysモジュール
PythonからWindowspyWinAuto内から呼び出すので、あらかじめインスコ
- SendKeysモジュール
- コロタエンヂニアリング
こちらが大変判りやすかったですー
今後使ってみたいモジュール
- pyHook
マウス、キーボードなどの入力イベントをフック。操作を記録するほうに使えそう。 - WATSUP – Windows Application Test System Using Python
pyWinAuto的な別のモジュール - Windows automation with Python
win32apiで直に。
pyWinAutoで、ちょとだけ困ったこと
- 便利すぎるので、悪用厳禁!!!
- 自動操作するためのコードを書くのが、けっこう大変。操作を記録してくれるソフトが有ると助かるかも。
(RocketMouseみたく) 誰か作ってー - SendKeyメソッド (sendkeyモジュール)は英語キーボード用。なので、日本語キーボードだと、コロンなどの記号がうまく入力できず。困った。
以下コード。
あくまで自分用なので、タイミング等によっては、うまく動かないことがあります。
# -*- 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)
Tags: CG, Python