NGMsoftware

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

    학습


    Python pyautogui 매크로 만들기.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 앞으로 파이썬으로 마우스 매크로와 키보드 매크로를 만드는 방법에 대해 아주~ 간단하게 알려드리도록 하겠습니다. 엔지엠 에디터로 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에서 파이썬을 개발하기 위한 환경 구성을 완료했습니다. 생각보다 쉽고 간단하죠? 

    터미널에서 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 함수의 신택스를 확인해보고 테스트 해보시기 바랍니다. 아마~ 이 글을 읽으시는 분들 모두가 쉽게 성공할거라 생각합니다. 그렇게 어렵지는 않으니까요. 다음에는 키보드를 제어하는 방법에 대해 알아보는 시간을 갖도록 할께요~ 궁금한 내용이 있다면 커뮤니티 > 질문과 답변 게시판에 남겨주시면 확인 후 알려드리도록 하겠습니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

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

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

    감사합니다~

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

    댓글목록

    profile_image

    양재동테리님의 댓글

    no_profile 양재동테리 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일 Date

    안녕하세요 파이썬 강좌 잘 봤습니다 
    마우스 클릭을 하고 싶은데
    특정 앱(게임창) 위에서는 마우스 클릭이 안되네요 ㅠ.ㅜ
    파이썬이 아닌 다른 프로그램(C# 등)으로는
    특정 앱(게임 창)위에서도 마우스클릭 잘되는데
    pyautogui 로는 마우스 이동까지만 되고
    마우스 클릭 명령어는 먹히지가 않네요
    파이썬에는 특정 앱(게임 실행 창)에 상관없이
    마우스 클릭을 할 수 있는 명령어는 없을까요?

    profile_image

    엔지엠소프트웨어님의 댓글

    엔지엠소프트웨어 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일 Date

    파이썬을 exe로 만들고, 프로그램을 관리자 권한으로 실행해보세요.