Python

파이썬 마우스와 키보드를 제어하는 방법( 매크로를 만들기 위한 필수 라이브러리 PyAutoGUI )

파이썬에서 마우스를 조작(컨트롤)하는 방법에 대해 알아봅니다.  마우스를 제어하기 위해서는 pyautogui 라이브러리(모듈)을 설치해야합니다.

파이썬에서 마우스 제어하는 방법

1.윈도우 콘솔(CMD)창 혹은 파이참 터미널 창에서 다음 명령어를 실행하여 라이브러리 설치

pip3 install pyautogui 

[설치 로그 내용]

PS C:pythonProject> pip3 install pyautogui
Collecting pyautogui
  Downloading PyAutoGUI-0.9.53.tar.gz (59 kB)
     |████████████████████████████████| 59 kB 1.7 MB/s
Collecting pymsgbox
  Downloading PyMsgBox-1.0.9.tar.gz (18 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Collecting PyTweening>=1.0.1
  Downloading pytweening-1.0.4.tar.gz (14 kB)
Collecting pyscreeze>=0.1.21
  Downloading PyScreeze-0.1.28.tar.gz (25 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Collecting pygetwindow>=0.0.5
  Downloading PyGetWindow-0.0.9.tar.gz (9.7 kB)
Collecting mouseinfo
  Downloading MouseInfo-0.1.3.tar.gz (10 kB)
Collecting pyrect
  Downloading PyRect-0.1.4.tar.gz (15 kB)
Collecting pyperclip
  Downloading pyperclip-1.8.2.tar.gz (20 kB)
Building wheels for collected packages: pyautogui, pygetwindow, pyscreeze, PyTweening, mouseinfo, pymsgbox, pyperclip, pyrect
  Building wheel for pyautogui (setup.py) ... done
  Created wheel for pyautogui: filename=PyAutoGUI-0.9.53-py3-none-any.whl size=36614 sha256=025c96bd8d331b48af0b9f273afefcf6cda41542b519e112f15270a884745c8
9
  Stored in directory: c:usersopeningappdatalocalpipcachewheelsd897e4d2edca92a87d3b5fbfb527264750a17b4ba297b9a7cab6e67f
  Building wheel for pygetwindow (setup.py) ... done
  Created wheel for pygetwindow: filename=PyGetWindow-0.0.9-py3-none-any.whl size=11078 sha256=57c877d611d4dc7f3fe8ce7ebc34c9fcb6c28fc8058862487b47ee92e4b8
2362
  Stored in directory: c:usersopeningappdatalocalpipcachewheels44ab20423c3a444793767e4e41f8377bc902f77bee212e68dcce85a5
  Building wheel for pyscreeze (PEP 517) ... done
  Created wheel for pyscreeze: filename=PyScreeze-0.1.28-py3-none-any.whl size=13023 sha256=4805f3fc078e6894c9e02313725fcba448b9f1e5cbd592974c11aeef5afb149
b
  Stored in directory: c:usersopeningappdatalocalpipcachewheelsa25b8699f1d8fac5d92de0ccb3f0d4ad15e3f4278baf75a9b0f20b93
  Building wheel for PyTweening (setup.py) ... done
  Created wheel for PyTweening: filename=pytweening-1.0.4-py3-none-any.whl size=5854 sha256=e7e696b4ae04ed43faf1adfc761f237be2761405df2e7d03d245cc31b839f1c
7
  Stored in directory: c:usersopeningappdatalocalpipcachewheelsa45dd2ba4c8f82163233ffaadcf383c1e34d7d92635d357d13e7b78d
  Building wheel for mouseinfo (setup.py) ... done
  Created wheel for mouseinfo: filename=MouseInfo-0.1.3-py3-none-any.whl size=10905 sha256=2afc8ed3f9b3c53ce3c8e919cfefbd9997f969bad1156944dbcd31aed4623cdc

  Stored in directory: c:usersopeningappdatalocalpipcachewheels6173b96fb1131ab36e650206e3aa0ad7a68907b41b32ac2d4f75f543
  Building wheel for pymsgbox (PEP 517) ... done
  Created wheel for pymsgbox: filename=PyMsgBox-1.0.9-py3-none-any.whl size=7420 sha256=cf28d77cad51f52eb77415c694c85593bb9b46d9ca5489cbdc2c2c6f50543f36
  Stored in directory: c:usersopeningappdatalocalpipcachewheels7f138c584c519464297d9637f9cd29fd1dcdf55e2a2cab225c76a2db
  Building wheel for pyperclip (setup.py) ... done
  Created wheel for pyperclip: filename=pyperclip-1.8.2-py3-none-any.whl size=11137 sha256=ca5ade8fdd18aa3040f5bdc16d79631da8f87b56c06f6a63076a743dcf58337c

  Stored in directory: c:usersopeningappdatalocalpipcachewheelsc99e49e21a6840ef7955b06d47394afef0058f0378c0914e48b8b8
  Building wheel for pyrect (setup.py) ... done
  Created wheel for pyrect: filename=PyRect-0.1.4-py2.py3-none-any.whl size=9547 sha256=fc2ef3a3f837d08db23f218d408e8b9edb7c6fd744ac7ef285233183a1ca09df
  Stored in directory: c:usersopeningappdatalocalpipcachewheelsed4c5b7f7be24ac0a168fd03d08afcc7c8928ef05cc1e319d1c136b
Successfully built pyautogui pygetwindow pyscreeze PyTweening mouseinfo pymsgbox pyperclip pyrect
Installing collected packages: pyrect, pyperclip, PyTweening, pyscreeze, pymsgbox, pygetwindow, mouseinfo, pyautogui
Successfully installed PyTweening-1.0.4 mouseinfo-0.1.3 pyautogui-0.9.53 pygetwindow-0.0.9 pymsgbox-1.0.9 pyperclip-1.8.2 pyrect-0.1.4 pyscreeze-0.1.28
WARNING: You are using pip version 21.1.2; however, version 21.3.1 is available.
You should consider upgrading via the 'C:pythonProjectvenvScriptspython.exe -m pip install --upgrade pip' command.
PS C:pythonProject>

2.import pyautogui 선언하여 라이브러 사용을 알림

import pyautogui

3. 마우스 실행정보 확인하는 프로그램 실행해보기

import pyautogui
pyautogui.mouseInfo()

마우스 커서의 X,Y 좌표 정보 및 RGB 값을 얻을 수 있습니다. 특정 좌표값이 필요할 때 커서 위치를 이동 후 좌표값을 복사하세요.


 

현재 마우스 포인트 위치의 X좌표, Y좌표 구하는 방법

position()함수를 사용하여 획득가능합니다. 

(x, y) tuple of the current xy coordinates of the mouse cursor.
import pyautogui

current_MouseX, current_MouseY = pyautogui.position()
print('현재 마우스의 x좌표: ' + str(current_MouseX) + '    y좌표:' + str(current_MouseY))

모니터 해상도 (가로, 세로 ) 확인하는 방법

pyautogui.size()함수를 이용하면 픽셀 단위로 스크린 사이즈를 리턴합니다. 리턴되는 데이터 타입은 튜플 자료형입니다.

import pyautogui

width, height = pyautogui.size()
print('가로: ' + str(width) + '    세로:' + str(height))

마우스 커서의 좌표 이동 방법

마우스 커서를 특정 위치로 이동시키는 방법은 move() 함수 또는 moveTo()함수를 이용하여 처리합니다. moveRel()함수를 사용해도 동일한 결과를 얻을 수 있습니다.

#pyautogui.moveTo(x좌표, y좌표, 시간)
import pyautogui
import time

# 마우스 커서를 화면의 400, 400 좌표로 이동합니다.
pyautogui.moveTo(400, 400)
# 1초 뒤에 
time.sleep(1)
# 좌표 800,800으로 이동합니다.
pyautogui.moveTo(800, 800)
import pyautogui

# 마우스 커서의 현재 위치로부터 x,y만큼 이동 
# duration=3은 3초동안 x,y좌표로 이동하라는 의미
pyautogui.move(200, 200, duration=3)
pyautogui.move(-200, -200, duration=2)
pyautogui.move(100, 100, duration=0.5)
import pyautogui

# 현재위치에서 참조값 만큼 마우스 이동
# pyautogui.moveRel(x축 참조값, y축 참조값, 시간)

# 현재 마우스 커서 위치에서 우측으로 200, 아래쪽으로 200 이동한다.( 2초 안에)
pyautogui.moveRel(120, 120, 2)

마우스 클릭 이벤트 제어하는 방법

마우스 클릭이벤트는 pyautogui.click()함수와 pyautogui.doubleClick()함수를 대표적으로 이용해서 처리합니다. 동일한 기능을 하는 함수들도 살펴봅니다.

# 마우스 왼쪽 버튼(1회 클릭)
pyautogui.click()

# 마우스 왼쪽 버튼 더블클릭 
pyautogui.doubleClick()
pyautogui.click(clicks=2)

# 마우스 오른쪽 버튼 클릭하기
pyautogui.click(button='right')
pyautogui.rightClick()

# 마우스 휠 클릭
pyautogui.middleClick()

# 마우스 버튼다운
pyautogui.mouseDown()

# 마우스 버튼업
pyautogui.mouseUp()

# 마우스로 특정좌표 클릭
pyautogui.click(x=823, y=584)

# 1초 안에 더블 클릭 1회
pyautogui.click(clicks=2, interval=1)

#마우스 왼쪽 버튼 10회 클릭
pyautogui.click(clicks=10)
# 마우스 클릭 응용하기
pyautogui.moveTo(800, 800)
pyautogui.click()
time.sleep(1)
pyautogui.move(0, 100, duration=0.5)
pyautogui.doubleClick()
# 마우스 클릭 응용하기2 (선긋기)
pyautogui.moveTo(200, 200)
pyautogui.mouseDown() # 마우스 왼쪽버튼 클릭 
pyautogui.moveTo(400, 400) # 버튼 누른 상태로 좌표이동
pyautogui.mouseUp() # 마우스 외쪽 클릭 해제

마우스 드래그 및 스크롤 제어 하는 방법

마우스를 드래그하기 위해서 pyautogui.dragTo()함수 또는 pyautogui.dragRel()함수를 사용할 수 있어요. 마우스 스크롤의 경우 pyautogui.scroll()함수를 이용합니다.

 
# 마우스 드래그
pyautogui.mouseDown(x=100, y=100)
pyautogui.mouseUp(x=200, y=200)

# 마우스 드래그
# 마우스 현재 위치에서 x=100, y=100로 드래그
pyautogui.dragTo(x=100, y=100)

# 2초안에 마우스 현재 위치에서 x=100, y=100로 드래그
pyautogui.dragTo(x=100, y=100, duration=2)

# 2초안에 마우스 현재위치에서 -100, -100위치로 드래그
pyautogui.dragRel(-100, -100, duration=2)

# 마우스 스크롤 (위로)
pyautogui.scroll(-100)

# 마우스 스크롤 (아래로)
pyautogui.scroll(100)

# 특정 위치로 이동(x=100, y=100) 후 스크롤
pyautogui.scroll(200, x=100, y=100)

pyautogui 부가기능 살펴보기

1. 화면 스크린샷 뜨는 방법

#전체화면 스크린샷
img = pyautogui.screenshot()
img.save('screenshot.png')

#화면의 일부영역 스크린샷 
img2 = pyautogui.screenshot('region.png', region=(100,100,400,400))

2. 픽셀값 비교하는 방법

import pyautogui

# 특정 위치(x,y) 좌표의 색상값 비교
p = pyautogui.pixel(1000,100)
print(p)
if pyautogui.pixelMatchesColor(1000, 100, p):
 print('일치')
else:
 print('불일치')


if pyautogui.pixelMatchesColor(1000, 200, p):
 print('일치')
else:
 print('불일치')

3. pyautogui 메시지 박스 사용하는 방법

  • alert()함수를 사용하여 알림창을 호출합니다.
import pyautogui as pg

a = pg.alert(text='내용', title='제목', button='OK')
print(a) # OK출력

  • pyautogui.confirm()함수를 사용하여 확인창을 호출합니다.
import pyautogui as pg

a = pg.confirm(text='집에갈래요?', title='알림', buttons=['OK', 'Cancel'])

# 취소버튼 클릭시 Cancel을 출력, 확인버튼 클릭시 OK 출력
print(a)

  • pyautogui.prompt()함수를 사용하여 프롬프트 , 입력창이 있는 메세지 박스를 표시합니다. OK버튼을 누르면 입력한 텍스트를 리턴합니다. Cancel 버튼을 누르면 None 값이 리턴됩니다.
import pyautogui as pg

a = pg.prompt(text='이름을 입력하세요', title='알림', default='입력하세요')
print(a)

  • pyautogui.password()함수를 사용하여 비밀번호 입력과 같은 메세지 박스를 호출합니다.
import pyautogui as pg

a = pg.password(text='비밀번호를 입력하세요', title='알림', default='1234', mask='*')
print(a)

 

pyautogui.FailSafeException오류발생시 처리 방법

pyautogui.FailSafeException:
PyAutoGUI fail-safe triggered from mouse moving corner of the screen. 
To disable this fail-safe, set pyautogui.FAILSAFE to False.
DISABLING FAIL-SAFE IS NOT RECOMMENDED.
# 마우스 제어의 오동작으로부터 벗어날 수 있도록 True로 설정
pyautogui.FAILSAFE = True 

#마우스 제어시 오류 발생시에도 실행을 멈추지않고 유지
pyautogui.FAILSAFE = False

파이썬에서 키보드(keyboard) 제어하는 방법

다음은 기본적으로 입력(press) 가능한 키 리스트입니다.

't', 'n', 'r', ' ', '!', '"', '#', '

pyautogui.write()함수와 pyautogui.typewrite()함수를 이용하여 문자열 입력이 가능합니다.

# 엔터키 누르기
pyautogui.press('enter')

# 여러 키 연속으로 입력하기
pyautogui.press(['backspace', 'enter', 'enter'])
pyautogui.press(['enter','enter','enter','enter'])
 
 
# 키보드의 쉬프트를 누르고 유지
# pyautogui.keyDown('shift')
# 쉬프트키 누름 해제
# pyautogui.keyUp('shift')

다음 예제는 2초 후 마우스 왼쪽 버튼 클릭이 발생하고, Hello python 타이핑 후 엔터키를 치는 이벤트가 발생한 후 다시 타이핑 하는 예제입니다. 다음 코드를 실행 한 후 메모장이나 타이핑이 가능한 에디터 박스 등에 마우스 커서를 이동시켜보세요. 

import pyautogui
import time

# 텍스트 입력 해보기
time.sleep(2)
pyautogui.click()
pyautogui.write('Hello python')
pyautogui.press('enter')
pyautogui.write('Hello pyautogui', interval=0.1)
# 텍스트 입력
pyautogui.typewrite('Hello python')

# 인터벌을 주면 입력 속도를 느리게 할 수 있어요
pyautogui.typewrite('Hello!', interval=0.25)
키를 여러번 입력하는 경우 다음과 같은 방식으로 입력

# 왼쪽 방향키를 세번 입력 case
pyautogui.press(['left', 'left', 'left']) 
pyautogui.press('left', presses=3) 

# enter 키를 2초에 한번씩 5번 입력합니다.
pyautogui.press('enter', presses=5, interval=2)

참고로 한글은 입력불가입니다. 그러나 메모장에 모드가 한글 입력모드(IME)라면 한글을 영어타이핑대로 입력하면 영어로 타이핑이 되지만 한글쓰기가 가능합니다.

import pyautogui
import time

pyautogui.typewrite('dkssudgktpdy!!')

탭키, 스페이스바, 페이지업, 페이지 다운키 누른 효과

import pyautogui

# pyautogui.click()
# pyautogui.press('tab')
# pyautogui.press(['space', 'pgup', 'pgdn'])
# 키를 누른 상태로 유지 후 떼기 ( Ctrl + C )
pyautogui.click()
pyautogui.keyDown('ctrl')
pyautogui.press('c')
pyautogui.keyUp('ctrl')

단축키 사용을 위한 pyautogui.hotkey()함수 이용하는 방법

여러 키를 동시에 입력해야하는 불편함을 해소하기 위해 hotkey()함수를 사용합니다. keyDown()함수와 keyUp()함수를 이용하여 여러키를 입력하면 불편함이 생겨서 사용하지 않게 되는 경우가 있지만, 단축키가 아닌 다른 상황에서는 아주 유용하게 사용합니다.

import pyautogui
import time

#단축키 사용
pyautogui.click()
pyautogui.hotkey('ctrl', 'shift', 'e')
time.sleep(0.5)
pyautogui.hotkey('ctrl', 'shift', 'f')
import pyautogui


# 복사 붙이기
# Ctrl + C (단축키 = hotkey)
pyautogui.hotkey('ctrl', 'c')

# Ctrl + V
pyautogui.hotkey('ctrl', 'v')

[REFERENCE]


, '%', '&', "'", '(',
')', '*', '+', ',', '-', '.', '/', '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.write()함수와 pyautogui.typewrite()함수를 이용하여 문자열 입력이 가능합니다.


다음 예제는 2초 후 마우스 왼쪽 버튼 클릭이 발생하고, Hello python 타이핑 후 엔터키를 치는 이벤트가 발생한 후 다시 타이핑 하는 예제입니다. 다음 코드를 실행 한 후 메모장이나 타이핑이 가능한 에디터 박스 등에 마우스 커서를 이동시켜보세요. 




참고로 한글은 입력불가입니다. 그러나 메모장에 모드가 한글 입력모드(IME)라면 한글을 영어타이핑대로 입력하면 영어로 타이핑이 되지만 한글쓰기가 가능합니다.


탭키, 스페이스바, 페이지업, 페이지 다운키 누른 효과



단축키 사용을 위한 pyautogui.hotkey()함수 이용하는 방법

여러 키를 동시에 입력해야하는 불편함을 해소하기 위해 hotkey()함수를 사용합니다. keyDown()함수와 keyUp()함수를 이용하여 여러키를 입력하면 불편함이 생겨서 사용하지 않게 되는 경우가 있지만, 단축키가 아닌 다른 상황에서는 아주 유용하게 사용합니다.



[REFERENCE]

Leave a Reply

error: Content is protected !!