【悪用厳禁】pyWinAutoを使って「ペイントソフトPixiaのPXAデータをPhotoshop(PSD)ファイルに変換する作業」を自動化

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

コメントを残す

メールアドレスが公開されることはありません。