[파이썬] Python 키보드, 마우스 제어(컨트롤)하는 방법(PyAutoGUI )

[파이썬] Python 키보드, 마우스 제어(컨트롤)하는 방법(PyAutoGUI )

오늘은 파이썬 언어로 마우스를 조작(컨트롤)하는 방법과 키보드를 제어하는 방법에 대해 알아봅니다. 

마우스와 키보드를 제어하기 위해pyautogui 라이브러리(모듈)을 설치해야합니다.

그런 다음 import pyautogui 선언하여 라이브러리를 사용할 수 있습니다.

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

pip3 install pyautogui 

[설치 과정의 log 내용]

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:\users\opening\appdata\local\pip\cache\wheels\d8\97\e4\d2edca92a87d3b5fbfb527264750a17b4ba297b9a7cab6e67f
  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:\users\opening\appdata\local\pip\cache\wheels\44\ab\20\423c3a444793767e4e41f8377bc902f77bee212e68dcce85a5
  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:\users\opening\appdata\local\pip\cache\wheels\a2\5b\86\99f1d8fac5d92de0ccb3f0d4ad15e3f4278baf75a9b0f20b93
  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:\users\opening\appdata\local\pip\cache\wheels\a4\5d\d2\ba4c8f82163233ffaadcf383c1e34d7d92635d357d13e7b78d
  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:\users\opening\appdata\local\pip\cache\wheels\61\73\b9\6fb1131ab36e650206e3aa0ad7a68907b41b32ac2d4f75f543
  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:\users\opening\appdata\local\pip\cache\wheels\7f\13\8c\584c519464297d9637f9cd29fd1dcdf55e2a2cab225c76a2db
  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:\users\opening\appdata\local\pip\cache\wheels\0c\09\9e\49e21a6840ef7955b06d47394afef0058f0378c0914e48b8b8
  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:\users\opening\appdata\local\pip\cache\wheels\0e\d4\c5\b7f7be24ac0a168fd03d08afcc7c8928ef05cc1e319d1c136b
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:\pythonProject\venv\Scripts\python.exe -m pip install --upgrade pip' command.
PS C:\pythonProject>

마우스 실행정보 확인하는 프로그램 실행해봅니다.

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

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

마우스 커서를 특정 위치로 이동시키는 방법은 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. 모니터 해상도 (가로, 세로 ) 확인하는 방법

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

import pyautogui

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

2. 화면 스크린샷 생성 후 이미지로 저장하기

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

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

3. 좌표값의 색상 픽셀값 비교하는 방법

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('불일치')

파이썬 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.password()함수를 사용하여 비밀번호 입력과 같은 메세지 박스를 호출합니다.
import pyautogui as pg

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

파이썬 프롬프트 입력창 메시지박스 호출방법

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

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

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

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()함수 이용하는 방법

여러 키를 동시에 입력해야하는 keyDown()함수와 keyUp()함수 이용의 불편함을 해소하기 위해 hotkey()함수를 사용합니다.

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

파이썬 키보드 제어를 위한 입력(press) 가능한 키 리스트

'\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 라이브러리 응용하여 매크로 만들기

[REFERENCE]

https://pyautogui.readthedocs.io/en/latest/


카테고리의 다른 글
error: Content is protected !!