UWSC を Python で置換しよう（2）関数置き換え

# はじめに

「UWSC を Python で置換しよう」第二回です。今回は低レベル操作系の置き換えをしていこうとおもいます。
とりあえず、方向性として、サンプルスクリプトを用意するか、UWSCの関数をPythonで再現するか悩んだ結果、UWSCの関数をPythonで再現する方向でやってみようかと。

<font color=red>※要はUWSCスクリプトを動かせるラッパーを目指したのですが、結論から言ってしまうと、UWSCとは似ても似つかない中途半端なものができてしまったので、次回は、大人しく、UWSCスクリプトの動作をPythonで再現する方向にしようと思います。取り敢えず、微妙なものになりましたが、どうなったのか気になる人もいる(?)とおもうので公開しておきます。</font>

前回は
[UWSC を Python で置換しよう（1）環境構築編](https://qiita.com/hirohiro77/items/f716259f769a59d0609d)
次回は
[UWSC を Python で置換しよう（3）チートシート[1]](https://qiita.com/hirohiro77/items/b62e2e00405bbe2e8ee5)

今回の対象はUWSCの関数

```
G_SCREEN_ , G_MOUSE_ , GET_WIN_DIR , GET_SYS_DIR , GET_CUR_DIR
ASC , CHR , MMV , BTN , KBD , CHKIMG , MSGBOX , INPUT , SAVEIMG 
```

- 使用モジュール

```head.py
# -*- coding: utf-8 -*-
import os,sys,re,time,subprocess
import pyautogui
import win32com.client
```

# 置き換え関数

早速、PythonでUWSCの関数を作っていく

- G_SCREEN_W(画面幅)

```
def G_SCREEN_W():
    screen_x,screen_y = pyautogui.size()
    return screen_x
```

- G_SCREEN_H(画面高)

```
def G_SCREEN_H():
    screen_x,screen_y = pyautogui.size()
    return screen_y
```

- G_SCREEN_C(画面色数)

```
def G_SCREEN_C():
    im  = pyautogui.screenshot()
    colordepth = im.dtype
    return colordepth
```

- GET_WIN_DIR(WindowsのPATH)

```
def GET_WIN_DIR():
    return os.environ['windir']
```

- GET_SYS_DIR(System32のPATH)

```
def GET_SYS_DIR():
    sysdir = os.environ['SystemRoot'] + '¥System32'
    return sysdir
```

- GET_CUR_DIR(カレントPATH)

```
def GET_CUR_DIR():
    return os.getcwd()
```

- ASC(文字コード変換)

```
def ASC(str):
    return str.encode('UTF-8')
```

- CHR(文字コード変換)

```
def CHR(str):
    return str.encode('ASCII')
```

- MMV(マウスカーソル移動)

```
# MMV(X,Y,ms)
def MMV(x,y,deley):
    msec = deley / 1000
    time.sleep(msec)
    pyautogui.moveTo(x,y)
```

- BTN(マウス操作)

```
def BTN(key,sta,x,y,deley):
    msec = deley / 1000
    time.sleep(msec)
    if sta == 0:
        if key == 'LEFT':
            pyautogui.click(x, y)
        if key == 'RIGHT':
            pyautogui.rightClick(x, y)
        if key == 'MIDDLE':
            pyautogui.middleClick(x, y)
        if key == 'WHEEL':
            pyautogui.scroll(sta, x, y)
        if key == 'TOUCH':
            pyautogui.click(x,y)
    if sta == 1:
        if key == 'LEFT':
            pyautogui.mouseDown(x, y, button='left')
        if key == 'RIGHT':
            pyautogui.mouseDown(x, y, button='right')
        if key == 'MIDDLE':
            pyautogui.mouseDown(x, y, button='middle')
        if key == 'WHEEL':
            pyautogui.scroll(sta, x, y)
        if key == 'TOUCH':
            pyautogui.mouseDown(x, y, button='left')
    if sta == 2:
        if key == 'LEFT':
            pyautogui.mouseUp(x, y, button='left')
        if key == 'RIGHT':
            pyautogui.mouseUp(x, y, button='right')
        if key == 'MIDDLE':
            pyautogui.mouseUp(x, y, button='middle')
        if key == 'WHEEL':
            pyautogui.scroll(sta, x, y)
        if key == 'TOUCH':
            pyautogui.mouseUp(x, y, button='left')
    if sta > 2:
        pyautogui.scroll(sta, x, y)
    if sta < 0:
        pyautogui.scroll(sta, x, y)
```

- KBD (キー操作)

```
def KBD(key,sta,deley):
    msec = deley / 1000
    time.sleep(msec)
    if sta == 0:
        pyautogui.press(key)
    if sta == 1:
        pyautogui.keyDown(key)
    if sta == 2:
        pyautogui.keyUp(key)
```

- CHKIMG (画像マッチング)

```
def CHKIMG(filename,maskcolor,rx1,ry1,rx2,ry2,num,conf):
    #返値はtuple型
    if len(conf) > 11:
        CFG = 0.95
    else:
        CFG = 0.98
    counter = 0        
    for pos in pyautogui.locateAllOnScreen(filename,region=(rx1,ry1,rx2,ry2),confidence=CFG):
        lpos = pos
        if counter == num:
            break
        counter += 1
    return lpos
```

- MSGBOX (メッセージボックス)

```
def MSGBOX(mes,btype):
    if btype == 'BTN_OK':
        result = pyautogui.alert(text=mes,title='',button='OK')
    if btype == 'BTN_NO':
        result = pyautogui.alert(text=mes,title='',button='NO')
    if btype == 'BTN_YES':
        result = pyautogui.confirm(text=mes, title='', buttons=['Yes', 'No'])
    if btype == 'BTN_CANCEL':
        result = pyautogui.confirm(text=mes, title='', buttons=['OK', 'Cancel'])
    if btype == 'BTN_ABORT':
        result = pyautogui.alert(text=mes,title='',button='ABORT')
    if btype == 'BTN_RETRY':
        result = pyautogui.alert(text=mes,title='',button='RETRY')
    if btype == 'BTN_IGNORE':
        result = pyautogui.alert(text=mes,title='',button='IGNORE')
    return result
```

- INPUT (入力ボックス)

```
def INPUT(mes,defv,hide):
    if hide == 0:
        result = pyautogui.prompt(text=mes, title='',default=defv)
    if hide == 1:
        result = pyautogui.password(text=mes, title='', default=defv, mask='*')
    return result
```

- SAVEIMG (スクリーンショット)

```
def SAVEIMAGE(filename,x1,y1,x2,y2):
    pyautogui.screenshot(filename,region=(x1,y1,x2,y2))
```

# 使ってみる

とりあえす、上記の関数を収めた、 `compatible_uwsc.py`を作った
で、 `uwsc_demo.py` というデモ用のファイルを作り、UWSCっぽいスクリプトを書く

```
# -*- coding: utf-8 -*-

import compatible_uwsc as UWSC

VAL1 = UWSC.INPUT('Please Input Word','Sample...',0)
UWSC.MSGBOX(VAL1,'BTN_OK')

UWSC.SAVEIMAGE('screenshot.png',1,1,1920,1080)

UWSC.MMV(10,15,1000)
UWSC.MMV(100,150,1000)
UWSC.MMV(10,150,1000)
UWSC.MMV(100,15,1000)
UWSC.MMV(50,150,1000)

UWSC.BTN('LEFT',0,100,100,1000)
UWSC.BTN('RIGHT',0,100,100,1000)

UWSC.KBD('ctrl',1,1000)
UWSC.KBD('a',0,1000)
UWSC.KBD('c',0,1000)
UWSC.KBD('ctrl',2,1000)
```

これだとPython的になってしまう…できればUWSCのスクリプトをそのまま動かせないかな…

# さいごに

ラッパーを作る方向で関数を作ると、UWSCをやってた人にはかろうじてわかる...かもしれないものができたが、これじゃない感がすごい。この方向は、スキルがないと私程度の知識では中途半端なものしかできそうにないので、失敗ですかね。
というわけで、次回以降は大人しく、UWSCで作ったスクリプトやUWSC関数の動作をPythonで再現していく方向にしようと思います。

次回は `UWSC を Python で置換しよう（3） チートシート` の予定