NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Python 뭐라도 해보자! 3부 - 누구나 쉽게 할 수 있는 파이썬 매크로 만들기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이 글을 처음부터 끝까지 읽어보고 따라하면 파이썬으로 마우스, 키보드와 이미지 서치 매크로를 만들 수 있게됩니다. 초보자를 대상으로 아주~ 간단하게 알려 드리도록 하겠습니다. 엔지엠 에디터로 1분이면 만들수 있긴하지만~ 파이썬으로 게임이나 간단한 업무를 자동화 하고 싶은 분들도 많기 때문에 알아두면 좋을거 같네요. 참고로, 이 내용을 학습하더라도 다양한 환경에 적용하려면 많은 노력이 필요합니다. 개발자라면 응용력은 어느정도 있을테니 문제가 안되지만, 일반인이라면 많은 시행착오를 겪게 될거에요^^; 그래도, 시작이 반이니 일단 만들어두면 공부하고자 하는 열정이 불타오를겁니다! 우선, 개발 환경을 만들어야 합니다. 아래 사이트에서 VSCode(Visual Studio Code)를 다운로드 합시다.

    비주얼 스튜디오 코드 다운로드 ]

    d4ONpLs.png

     

     

    VSCode는 설치하는데 복잡한 설정이나 변경해야 할 부분은 없습니다. 서버 설치나 데이타베이스와 같이 시스템에 영향을 주거나 사용자 계정 및 권한 관리등등 선택하는게 없기 때문입니다. C드라이브에 용량이 없다면 설치 위치정도 변경할 수 있겠네요. 하지만, 가능하면 기본값으로 설치하세요. 설치가 완료되면 비주얼 스튜디오 코드를 실행해줍니다. 아래와 같은 화면을 볼 수 있습니다.

    ※ 워크 스페이스나 환경에 따라 다를 수 있지만, 대부분은 아래와 비슷한 화면이 열릴겁니다.

    BaG57bn.png

     

     

    우리는 한글이 익숙하므로 한글로 변경해줍시다.

    1. 확장 클릭. (Extensions, Ctrl+Shift+X)
    2. korean 입력
    3. Korean Language Pack for Visual Studio Code - Install 클릭

    isjJGpP.png

     

     

    설치가 완료되면 ①Restart를 클릭하세요.

    errOLTT.png

     

     

    아래 그림과 같이 한글로 변경되었죠? 영어로만 보다가 한글로 보니깐 왠지 생소하네요 ㅎㅎ;

    kkWQjyt.png

     

     

    이제 파이썬을 설치 해볼까요? Extensions(Ctrl+Shift+X)를 눌러서 python을 검색합니다. 저는 이미 설치되어 있는데요. 여러분들은 아래 3가지를 모두 설치해야 합니다.

    8I4d5TV.png

     

     

    프로그래밍 언어를 처음 시작할 때 항상 하는게 있는데요. 바로~ "Hello NGMsoftware!"입니다. 개발자들이 이런걸 항상 하는 이유는 간단합니다. 개발 환경이 잘 갖춰지고 정상적으로 동작하는지 확인하기 위함이죠. 그리고, 언어를 가르치는 대부분의 전문 서적이나 사이트에서 저렇게 하기 때문에 의례 하는것 정도로 이해하시면 됩니다. 그렇게 큰 의미를 가진건 아닙니다. 아래 그림과 같이 좌측 상단 메뉴에서 파일 > 새 파일을 클릭하세요.

    KPFHkct.png

     

     

    새로운 파일이 만들어졌습니다. 이상태에서 Ctrl+S를 눌러서 저장할 수 있는데요. VSCode는 대부분의 언어를 개발할 있도록 만들어진 IDE이기 때문에 단순히 파일만 만들어서는 어떤걸 할지 알 수 없는 상태가 됩니다. 그래서, 파일을 저장하면서 확장자를 지정하거나 아래 그림처럼 "언어 선택"을 통해 명시적으로 Visual Studio Code에게 알려줘야 합니다. "언어 선택"을 클릭해보세요.

    ※ 파일을 py 확장자로 저장하면 자동으로 파이썬으로 인식합니다. 파이썬 확장이 없으면 알려줍니다.

    m8ZozK1.png

     

     

    python을 입력하고, 검색된 항목을 클릭해줍니다.

    RGpS2SA.png

     

     

    아래와 같이 코딩을 추가하고, Ctrl+S를 눌러서 "start.py"로 저장합니다. 프린트 함수는 인자로 텍스트를 받고, 실행하면 텍스트를 출력해주는 기능을 합니다. 이제 막 시작 단계라서 함수와 인자에 대한 설명은 건너뛰고 동작이 되는지만 확인하시면 됩니다. 그리고, 처음에는 어쩔 수 없이 무조건 외우는 수밖에 없습니다.

    ※ 컴파일(실행)하면 자동으로 저장됩니다. 하지만, 가능하면 저장하는 습관을 들이는게 좋습니다.

    print("Hello NGMsoftware!")

    98jCEHB.png

     

     

    혹시라도 F5로 실행이 되지 않는다면, 우측 하단에 표시되는 알람 "Select Interpriter"를 클릭하고 설치되어 있는 파이썬을 선택하세요.

    ※ 설치된 확장의 종류에 따라 실행 단축키가 다른 기능에 연결되어 있을수도 있습니다.

    Zkm8fW7.png

     

     

    파이썬을 실행할 단축키를 설정하고 갑시다. 영문 버전이면 "File > Preferences > Keyboard Shortcuts"로 이동하면 됩니다. 한글 버전은 아래와 같이 이동하세요.

    dQVUSvs.png

     

     

    저는 주로 빌드 또는 컴파일 또는 실행을 F5로 사용합니다. 자신의 취향에 맞게 설정하면 됩니다. 바로 가기 키에서 "Type to search in keybindings"에 "run python file in terminal"을 입력하세요. 검색에서 나온 항목에서 좌측에 + 버튼을 클릭합니다.

    DmQXiW6.png

     

     

    F5를 누르고 엔터를 치면 입력됩니다. 만약, 중복이 있거나 자신이 원하는 조합키가 있다면 그걸 넣어도 상관 없습니다.

    2B5H9nH.png

     

     

    아래와 같이 키 바인딩이 설정되었습니다.

    AE556a0.png

     

     

    start.py 파일을 선택하고, F5를 눌러보세요. 하단에 출력 결과를 확인할 수 있습니다.

    img.png

     

     

    여기까지 윈도우즈 10에서 파이썬을 개발하기 위한 환경 구성을 완료했습니다. 생각보다 쉽고 간단하죠? 그림만 보고 잘 따라했으면 아마 여러분들도 동일한 결과를 확인 했을겁니다. 개발자라면 뭐~ 안보고도 했을거에요^^; 요즘보면 왕초보도 개발자가 될 수 있다는 광고를 종종 보곤 합니다. 개발자도 나름 전문직인데 3개월 또는 6개월만에 개발자가 될 수 있다는게 정말 가능한지 의문이 들기도 합니다. 하지만~ 누군가는 노력해서 분명 될거예요. 요즘 같이 어려운 시기에는 노력 만큼 가시적인 결과를 가져다 주는건 없을겁니다~ 연봉 1억 개발자가 되기 위해서 같이 달려봅시다!

     

    터미널에서 pyautogui를 설치해줍니다. 아래 명령을 수행해도 설치가 안된다면 [ 여기 ]를 참고해보세요.

    pip install pyautogui

     

    아래 코드를 Start.py에 코딩하고, F5를 눌러서 실행 해보세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 마우스를 현재 위치에서 X 방향으로 200, Y 방향으로 200 이동합니다.
    pyautogui.move(200, 200)

    s8j9gY8.gif

     

     

    마우스가 움직이는걸 확인하셨나요? 마우스가 순간 이동하기 때문에 좀 천천히 이동하도록 변경한 후 다시 실행 해볼께요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 마우스를 현재 위치에서 X 방향으로 200, Y 방향으로 200 이동합니다.
    # 마지막 인자인 듀레이션 3을 넣으면 좌표로 3초동안 이동합니다.
    pyautogui.move(200, 200, 3)

    FQKfztz.gif

     

     

    pyautogui의 move는 현재 위치에서 설정한 X, Y 좌표로 마우스가 이동합니다. 마지막 인자인 Duration(듀레이션)은 마우스의 이동 시간을 나타냅니다. 간단한거지만, 대각선이 아닌 상하로 이동하려면 어떻게 해야 할까요? X값은 0으로 두고 실행해보세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 마우스를 현재 위치에서 Y 방향으로 200 이동합니다.
    # 마지막 인자인 듀레이션 3을 넣으면 좌표로 3초동안 이동합니다.
    pyautogui.move(0, 200, 3)

    rabPNgS.gif

     

     

    간단하죠? pyautogui의 move는 현재 마우스 좌표에 대해 상대적입니다. 상대적인 좌표 이동은 현재 위치에 영향을 받으므로 원하는 위치로 이동하려면 현재의 마우스 위치를 알아내야 합니다. 그래야 목표 지점으로 가기 위한 절대 좌표를 알 수 있으니까요. 그러면 현재 마우스의 위치는 어떻게 알 수 있을까요?

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # position 함수는 마우스의 현재 위치를 반환합니다.
    print(pyautogui.position())

     

    실행하면 터미널에 현재 마우스의 위치가 출력됩니다. print 는 다른 언어에서 제공하는 Console과 동일합니다. 표준 출력을 담당하죠. 어떤 이유인지 명확하지는 않으나, 콘솔은 데스크에서 입출력이 가능한 장치에서 유래했기 때문에 표준 출력을 담당하는 경우 프린트를 사용하는게 아닌가 생각됩니다. 아무튼, 대부분의 언어가 콘솔에서 출력을 확인하지만, 이또한 Output으로 분리되기도 합니다. 아무튼, 파이참이나 주피터와 같은 파이썬 개발 전용 IDE는 콘솔을 제공합니다.

    PS C:\Users\ngmas\Desktop\PythonMacro> & C:/Users/ngmas/AppData/Local/Microsoft/WindowsApps/python3.9.exe c:/Users/ngmas/Desktop/PythonMacro/start.py
    Point(x=716, y=367)
    PS C:\Users\ngmas\Desktop\PythonMacro> 

     

    자~ 우리는 이제 현재 마우스 위치를 알아냈습니다. 그러면 내가 원하는 절대 좌표로 이동하려면 어떻게 해야 할가요? 예로 좌측 상단의 100, 100으로 이동한다고 생각해봅시다. 아주 간단한 산수 문제인데요. 아래와 같이 목표 위치에서 현재 위치를 빼주면 됩니다. 실행하고 확인 해볼까요?

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # position 함수는 마우스의 현재 위치를 반환합니다.
    x, y = pyautogui.position()
    # X 100, Y 100 좌표로 이동하기 위해
    # 목표 위치에서 현재 위치를 빼줍니다.
    pyautogui.move(100 - x, 100 - y, 3)

    14ORHdF.gif

     

     

    이렇게 절대 좌표로 쉽게 이동할 수 있습니다. 하지만, 더 쉽게 절대 좌표로 이동할 수 있는 함수가 있는데요. 당연한 말이지만~ 대부분은 이 함수를 이용해서 매크로를 만들고 있습니다. 물론, 엔지엠 에디터도 상대 좌표와 절대 좌표로 이동할 수 있는 방법을 제공합니다. 상대 좌표가 필요한 경우는 FPS 게임이나 마우스로 방향을 정하는 MMORPG 게임에서 사용할 수 있습니다. 이외에는 대부분 절대 좌표를 사용하고 있습니다. 절대 좌표로 이동하려면 moveTo 함수를 이용해야 합니다. 아래와같이 코드를 변경하고 실행 해보세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 절대 좌표 100, 100 위치로 마우스를 이동합니다.
    pyautogui.moveTo(100, 100, 3)

    iivEGss.gif

     

     

    특별히 계산하지 않아도 원하는 목표 지점으로 마우스가 이동되는걸 알 수 있습니다. 자 그러면~ 본격적으로 내가 원하는 위치를 클릭해보죠. 일단 클릭할 위치가 어딘지 알아내야 합니다. 이걸 알아내기 위해서는 좌표를 확인해야겠죠? 이건 위에서 설명한 position 함수를 이용해야 합니다. 단순히 마우스 위치만을 출력하면 터미널에 찍히는 좌표를 외워야 하는 불편함이 있습니다. 그래서, 윈도우 이벤트를 후킹해서 클릭하는 경우 멈추도록 해보겠습니다. 아래 코드로 수정하세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 마우스 이벤트를 후킹하기 위해 win32 모듈을 가져옵니다.
    import win32api
    
    # 마우스 좌표값을 게속해서 출력하기 위해 와일문을 만듭니다.
    while True:
        # win32 api로 마우스의 상태를 가져옵니다.
        down = win32api.GetKeyState(0x01)
        # 마우스 상태가 다운이면 와일문을 탈출합니다.
        if down == 0:
            break
        # 마우스의 현재 좌표를 출력합니다.
        print(pyautogui.position())

     

    음~ 개발자가 아니라면 위 코드는 좀 어려울 수 있습니다. 주석을 친절(?)하게 달아두긴 했지만, 일반인이 보기에는 이해하기 어려울겁니다. 아무튼, 실행해보면 어떻게 돌아가는지 확인할수 있는데요. 코드에 적혀 있는 주석과 실제 동작을 비교해보면 어느정도 이해할 수 있을거라고 생각합니다. 만약, 실행이 되지 않는다면 아래 명령을 통해 win32api를 설치 해주세요.

    pip install win32api

     

    win32api보다 쉽게 후킹할 수 있는 pyHook도 있습니다. pyHook는 윈도우에 설치해야 하므로, 간단하게 win32api를 사용했습니다. 나중에 pyHook를 사용해서 윈도우를 후킹해서 메시지를 조작하는 방법도 알아보도록 할께요. 이번에는 간단하게 마우스를 어떻게 제어하는지에만 집중해서 진행하도록 하겠습니다. F5를 눌러서 실행 해보세요. 그리고, 목표 위치에서 클릭하면 좌표를 확인할 수 있습니다. 아래 동영상에서는 내문서(소심비형)를 클릭하고, 좌표를 확인하고 있습니다.

    awnPTeE.gif

     

     

    마지막에 찍힌 좌표가 X 39, Y 23입니다. 이 위치가 바탕화면의 내문서 폴더 위치입니다. 여기를 클릭해볼까요?

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 내문서를 클릭합니다.
    pyautogui.moveTo(39, 23, 3)
    pyautogui.click()

    CghC9XE.gif

     

     

    더블 클릭으로 내문서 폴더를 열어봅시다. 코드가 없더라도 여러분들은 이제 직접 할 수 있을겁니다^^;

    i8p6qDb.gif

     

     

    이쯤에서~ 마우스 오른쪽 클릭은 어떻게 해야 할까 궁금할겁니다. 아래 코드를 붙여넣기 하고, 실행 해보세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 내문서로 마우스를 이동합니다.
    pyautogui.moveTo(39, 23, 3)
    # 마우스 오른쪽을 클릭합니다.
    pyautogui.click(button='right')

    HfPnHfi.gif

     

     

    너무 빠르게 컨텍스트 메뉴가 표시되었다가 사라지네요. 그래도 확인은 되었을거라 생각합니다. 마우스 가운데 버튼(보통은 휠이 여기에 있습니다.)을 클릭하려면 right 대신 middle을 입력하면 됩니다. 코드를 좀 더 간단하게 변경 해볼까요? 아래와같이 클릭에 대한 인자를 직접 설정해도 동일한 결과를 얻을 수 있습니다.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 내문서를 마우스 오른쪽 클릭합니다.
    pyautogui.click(x=39, y=23, duration=3, button='right')

    FyclnGp.gif

     

     

    여러분들도 응용하기 위해서는 syntax(구문, 신택스)를 알아야 합니다. 아래와 같이 해당 함수를 클릭하고 F12를 눌러보세요.

    8pr5PBZ.gif

     

     

    아마도~ 함수의 정의로 이동되었을겁니다. 내용을 보면 자세하게 설명되어 있고, 어떻게 사용해야 하는지 알려줍니다. IDE에 따라 단축키는 다르지만, 비주얼 스튜디오(Visual Studio) 계열은 F12로 함수 또는 클래스의 정의로 이동할 수 있습니다. 신택스를 볼 수 있으면 개발은 거의 끝났다고 보시면 됩니다. 함수 사용법을 알아냈으니 머리속에 생각한대로 코딩만 하면 되니까요^^ 마지막으로 드래그하는 방법을 알아보죠~ 아래 코드는 내문서 폴더를 가장 마지막으로 이동시킵니다.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 마우스를 내문서 위치로 이동합니다.
    pyautogui.moveTo(39, 23)
    # 왼쪽 누른 후 좌표로 듀레이션만큼 이동합니다.
    pyautogui.dragTo(39, 500, 3)

    mOhmjIa.gif

     

     

    생각보다 쉽죠^^? 여러분들은 이제 마우스 기능을 거의 마스터 했습니다. 아직 알아보지 않은 한가지가 남았는데요. 그건 바로~!!! 스크롤입니다. 스크롤바가 있는 클라이언트가 있으면 쉽게 테스트가 가능한데요. 현재 윈도우 바탕화면에서 스크롤할만한 프로그램이 없습니다. 그래서 건너뛰고 마무리하려는거죠. 이 부분은 직접 scroll 함수의 신택스를 확인해보고 테스트 해보시기 바랍니다. 아마~ 이 글을 읽으시는 분들 모두가 쉽게 성공할거라 생각합니다. 그렇게 어렵지는 않으니까요.

     

    RPA나 업무용 자동화 매크로 또는 주식을 자동으로 매매하려는 분들은 이미지 서치와 마우스 클릭만으로도 충분히 반자동 매크로를 만들 수 있을겁니다. 완전 자동화를 하려면 이미지 서치뿐만 아니라 키보드와 OCR(광학 문자 인식, Optical Character Recognition)도 필요합니다. 이외에 딥러닝을 사용할 수 있는 다크넷의 욜로나 예외 상황에 대처할 수 있는 추가적인 응용 능력도 갖춰야 합니다. 대부분은 엔지엠 에디터를 사용하면 프로그래밍을 몰라도 완전한 무인 자동화를 만들 수 있습니다.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(150, 100)
    # 메모장에 텍스트를 입력합니다.
    pyautogui.write("Hello~ NGMsoftware!")

    1kKVYwf.gif

     

     

    비활성 모드로 텍스트를 입력하는건 아니라서 메모장을 한번 클릭해줘야 합니다. 해당 창이 활성화되어야 키보드 입력이 들어가니까요~ 좀 더 천천히 텍스트를 입력하려면 어떻게 해야 할까요? 아래와 같이 인터벌(Interval, 간격: 시간적인)을 설정하면 됩니다. 엔지엠 에디터는 랜덤하게 타이핑하듯이 작성할 수 있지만 파이썬은 약간 제약이 있네요. 물론, down, up으로 char를 넘겨서 처리하면 가능합니다^^;

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에 텍스트를 입력합니다.
    pyautogui.write("\nHello~ NGMsoftware!", interval=0.3)

    y8YaCGA.gif

     

     

    조합키를 입력하려면 어떻게 해야 할까요? Ctrl+A, Ctrl+C, Ctrl+V와 같은 키들을 말합니다. 이외에도 조합키는 많지만, 예제로 사용하기에는 가장 좋은 단축키들입니다. 메모장에 있는 내용들을 전체 선택하고, 복사한 후 다른 메모장에 붙여넣기 하는 방법입니다. 아래 코드를 붙여넣기하고 실행(F5) 해보세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에서 전체 선택합니다.
    pyautogui.keyDown("ctrl")
    pyautogui.keyDown("a")
    pyautogui.keyUp("a")
    pyautogui.keyUp("ctrl")
    # 메모장에서 선택 영역을 복사합니다.
    pyautogui.keyDown("ctrl")
    pyautogui.keyDown("c")
    pyautogui.keyUp("c")
    pyautogui.keyUp("ctrl")
    # 붙여넣기 할 메모장을 클릭합니다.
    pyautogui.click(300, 600)
    # 클립보드 내용을 메모장에 붙여넣기 합니다.
    pyautogui.keyDown("ctrl")
    pyautogui.keyDown("v")
    pyautogui.keyUp("v")
    pyautogui.keyUp("ctrl")

    idr716K.gif

     

     

    보통은 이렇게 사용하지 않고 있습니다. 좀 더 편하게 사용할 수 있는 핫키 함수가 있는데요. 아래와 같이 코드를 변경하고 다시 실행 해보세요.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에서 전체 선택합니다.
    pyautogui.hotkey("ctrl", "a")
    # 메모장에서 선택 영역을 복사합니다.
    pyautogui.hotkey("ctrl", "c")
    # 붙여넣기 할 메모장을 클릭합니다.
    pyautogui.click(300, 600)
    # 클립보드 내용을 메모장에 붙여넣기 합니다.
    pyautogui.hotkey("ctrl", "v")

    vwVyg8C.gif

     

     

    코드량을 많이 줄었는데요. 동작은 동일합니다^^; 마지막으로 알아볼 함수는 press입니다. spy++을 이용해서 윈도우 메시지를 확인 해보면 키보드는 keyDown, keyPress, keyUp으로 동작하는걸 알 수 있습니다. 위에서 조합키를 만들 때 keyDown(Ctrl), keyDown(A), KeyUp(A), KeyUp(Ctrl)과 같이 만들었습니다. 대부분은 정상 동작할겁니다. 하지만, 윈도우 메시지를 인터셉트해서 분석하는 소프트웨어라면 명령이 수행되지 않을수도 있습니다. 대부분의 매크로 프로그램들이 단순하게 작성되기 때문이죠. 그래서 처음 코드를 아래와 같이 작성하는게 더 좋습니다.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에서 전체 선택합니다.
    pyautogui.keyDown("ctrl")
    pyautogui.keyPress("a")
    pyautogui.keyUp("ctrl")
    # 메모장에서 선택 영역을 복사합니다.
    pyautogui.keyDown("ctrl")
    pyautogui.keyPress("c")
    pyautogui.keyUp("ctrl")
    # 붙여넣기 할 메모장을 클릭합니다.
    pyautogui.click(300, 600)
    # 클립보드 내용을 메모장에 붙여넣기 합니다.
    pyautogui.keyDown("ctrl")
    pyautogui.keyPress("v")
    pyautogui.keyUp("ctrl")

     

    이보다 더~ 정직하게 소프트웨어 자동화가 아닌것처럼 하려면 전부 keyDown, keyPress, keyUp으로 만들어주는게 좋습니다. 실제 하드웨어 키보드의 5초간 키를 누르고 있는 윈도우 메시지를 보면 아래와 같이 입력되는걸 알 수 있습니다.

    down press press press ... up

     

    소프트웨어로 키보드를 누르고 있으면 보통은 down과 up만 존재합니다. 이걸로 소프트웨어 신호인지 금방 알 수 있게됩니다. 키를 누르고 있는 효과를 내려면 아래와 같이 코드를 변경할 수 있습니다.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에 A를 계속 입력합니다.
    pyautogui.keyDown("shift")
    pyautogui.press("a", presses=10)
    pyautogui.keyUp("shift")
    pyautogui.press('enter', presses=3, interval=3)

    qH3PGvB.gif

     

     

    자~ 이제 진짜 마지막인데요. 위의 예제들은 전부 영문으로만 입력하고 있었습니다. 한글로 입력을 해볼까요?

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에 A를 계속 입력합니다.
    pyautogui.write("안녕하세요. 엔지엠소프트웨어입니다.")

    ujh7RdS.gif

     

     

    위의 결과와 같이 파이썬에서 한글은 입력할 수 없습니다-_-; IME 모드를 감지해서 스마트하게 한영을 전환해주지도 못하죠~ 물론, win32api를 이용하면 ActiveWindow의 IME 상태를 가져올 수 있긴합니다. 개발자가 아니라면 이런 세세한 부분까지 신경써서 만드는건 불가능합니다. 개발자라고 하더라도 혼자 쓰는 경우에는 환경을 어느정도 맞춰놓고 쓰기 때문에 문제가 되지 않죠. 엔지엠 에디터처럼 범용적인 소프트웨어가 만들기 어려운 이유가 바로 여기에 있습니다. 모든 경우의 수를 대비해야 하기 때문이죠. 동의하지 않는 분들도 많을겁니다^^; 편법이긴 하지만~ 클립보드에 텍스트를 넣고 대상 윈도우에서 Ctrl+V(붙여넣기)를 입력하는 방법입니다. 아무래도~ 이 방법은 부정확하고 불편하죠.

    # pyautogui 모듈을 가져옵니다.
    import pyautogui
    # pyperclip 모듈을 가져옵니다.
    import pyperclip
    # 클립보드에 텍스트를 복사합니다. 
    pyperclip.copy("안녕하세요. 엔지엠소프트웨어입니다.") 
    # 메모장을 클릭합니다.
    pyautogui.click(300, 100)
    # 메모장에 클립보드 내용을 붙여넣기 합니다.
    pyautogui.hotkey("ctrl", "v")

    jJPGFFP.gif

     

     

    아래 내용을 참고해서 필요한 키보드를 입력해보세요.

    ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(',
    ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '', ']', '^', '_', '`',
    'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
    'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace',
    'browserback', 'browserfavorites', 'browserforward', 'browserhome',
    'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear',
    'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete',
    'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
    'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20',
    'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9',
    'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja',
    'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail',
    'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
    'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6',
    'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn',
    'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn',
    'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator',
    'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
    'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen',
    'command', 'option', 'optionleft', 'optionright']

     

    이제 마지막으로 모니터 화면에서 원하는 이미지를 찾아 클릭하는 방법에 대해 알아볼께요. 최대한 복잡한 설명은 배제하고, 동작할 수 있는 요점만 설명하면서 진행하도록 하겠습니다. 이미지 서치(엔지엠에서는 이미지 매치)와 마우스 클릭을 위한 패키지들을 설치 해줍니다. pyautogui는 파이썬 스크립트가 마우스와 키보드를 제어하여 다른 프로그램과 상호 작용할 수 있게 해줍니다. 장점은~ Windows, MacOS, Linux에서 작동한다는 점입니다. 리눅스는 GUI를 지원하는 버전에서만 되겠죠^^;

    pip install pyautogui

     

    이미지 서치에는 OpenCV가 필요합니다. 아래와 같이 패키지를 설치 해주세요.

    pip install opencv-python

     

    마지막으로~ 파이썬에서 이미지를 처리해주는 필로우를 설치하세요.

    pip install pillow

     

    파이썬은 스크립트 언어입니다. 보통 많이 알고 있는 자바스크립트와 같은 스크립트 언어들은 한줄씩 인터프리터가 해석하면서 실행됩니다. 그렇다보니 이미지를 바이트로 처리하는데 문제가 있습니다. 이런 문제를 해결해주는 패키지가 필로우입니다. 스크립트 언어들은 컴파일 언어에 비해 속도가 느릴수밖에 없습니다. 이제 찾을 이미지를 만들어야겠죠? 찾고자 하는 이미지를 source라고 명명하고, 소스 이미지를 찾을 전체 화면을 target이라고 부르겠습니다. 엔지엠 에디터를 실행한 후 아래와 같이 소스 이미지를 바탕화면에 저장합니다.

    ※ 파일명을 source.png 로 변경하세요.

    fqB4YOB.gif

     

     

    아래 코드를 복사하여 붙여넣기 하고 Ctrl+F5(실행)를 눌러서 실행해보세요. 전체 스크린에서 "source.png" 이미지를 모두 찾아줍니다. 유사도를 설정할수도 있지만 일단은 기본값을 처리해도 원하는 이미지를 잘 찾을 수 있습니다. 이 예제에서는 동일한 고양이가 한마리라서 하나만 리턴 받게 됩니다.

    import pyautogui
    import time
    
    p_list = pyautogui.locateAllOnScreen("C:\\Users\\<사용자>\\Desktop\\source.png")
    p_list = list(p_list)
    print(p_list)

     

    리턴 받은 값을 찍어보면 아래와 같은 좌표 값이 표시됩니다.

    PS C:\Users\ngmas\Desktop>  c:; cd 'c:\Users\ngmas\Desktop'; & 'C:\Users\ngmas\AppData\Local\Programs\Python\Python39\python.exe' 'c:\Users\ngmas\.vscode\extensions\ms-python.python-2020.12.424452561\pythonFiles\lib\python\debugpy\launcher' '57797' '--' 'c:\Users\ngmas\Desktop\image_search.py' 
    [Box(left=723, top=330, width=123, height=107)]
    PS C:\Users\ngmas\Desktop> 

     

    엔지엠 에디터에서도 이미지 매치를 해보면 동일한 결과를 확인할 수 있습니다.

    2l9kfqQ.png

     

     

    이제 찾은 이미지를 클릭하는 코드를 작성합니다.

    import pyautogui
    import time
    
    p_list = pyautogui.locateAllOnScreen("C:\\Users\\<사용자>\\Desktop\\source.png")
    p_list = list(p_list)
    p_center = pyautogui.center(p_list[0])
    pyautogui.click(p_center)

     

    Ctrl+F5(실행)를 눌러서 실행 해보세요.

    OZ0vw79.gif

     

     

    여러분들도 잘 동작하죠? 위와 같은 방식으로 이미지를 찾아서 클릭하는걸 반복하면 원하는 자동화를 공짜로 쉽게 얻을 수 있게될겁니다. 생각보다 그렇게 어렵지는 않거든요~ 매크로를 만드는게 어려운건 아닙니다. 처음부터 끝까지 많은 로직들의 이미지와 좌표를 확인하고 클릭하거나 키보드가 동작할 수 있도록 코딩하는게 상당한 노가다성 작업입니다. 기본적인 몇가지만 외워서 활용한다면 비싼돈주고 제작을 의뢰하지 않아도 됩니다. 아무튼~ 이렇게 해서 간단하게 파이썬으로 이미지 서치를 만들어봤습니다. 다음에는 더 유익하고 재미있는 내용으로 찾아올께요^^

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.