1. PyAutoGUI란?
PyAutoGUI는
- 마우스 이동 및 클릭,
- Keyboard 입력,
- 스크린 캡처 및 단순한 화면 인식 등 다양한 기능을 제공하여
반복적인 컴퓨터 작업을 자동화할 수 있는 Python 기반의 강력한 Automation Library임
공식 documentation Url: https://pyautogui.readthedocs.io/en/latest/index.html
참고로, macOS나 Linux에 비해 Windows에서 보다 유용한 기능이 먼저 나오는 편임.
pyautogui.getActiveWindow()와 같이- 현재 활성화된 windows의 위치를 얻어오는 기능이 2025.07 현재 Windows에만 가능함.
- 정확히는
Win32Window객체를 얻어와서 이 객체로부터 위치 및 title 등의 정보를 attribute들을 통해 접근가능
참고: 비슷한 라이브러리-pynput
pynput은 Python에서 키보드와 마우스의 입력스트림을 모니터링하고 제어할 수 있게 해주는 크로스 플랫폼 라이브러리
- pynput은 입력 이벤트 모니터링에 특화된 반면,
- pyautogui는 스크린샷과 이미지 인식을 포함한 포괄적인 GUI 자동화에 더 적합
- 즉, 사용자 입력을 녹화하는 recorder나 key logger 구현에는 pynput이 보다 적합함.
official documentation url: https://pynput.readthedocs.io/en/latest/
주의: pyautogui의 자동화 수행을 중단시키는 방법
logout 으로 수행 중단
사용자가 logout하면 현재 실행되는 프로그램들이 모두 종료(shutdown)됨.
- logout short hand key:
- Windows와 Linux의 경우 CTRL+ALT+DEL
- macOS의 경우 cmd+SHIFT+Q
FailSafeException 이용 (PyAutoGUI가 제공하는 fail-safe feature)
- 모든 PyAutoGUI 함수 호출은 수행후 1/10 초 (
pyautogui.PAUSE의 설정값) 정도의 pause를 가짐 - 이 시간을 이용하여 사용자는 마우스 커서를 화면의 4개의 코너로 이동시킬 수 있음.
- 사용자가 화면의 4개의 코너에 마우스 커서를 이동시키면,
pyautogui는pyautogui.FailSafeException을 발생시킴.- Puase duration은
pyautogui.PAUSE를 통해 seconds 단위로 설정 가능(float) pyautogui.FAILSAFE = False로 이 기능의 비활성화 가능하나 추천하지 않음
다음은 FailSafeException을 사용해보려는 예제임.
수행하고 나서 5초 정도 이후에 마우스를 화면 왼쪽 위 코너로 이동시켜서 pyautogui.FailSafeException을 발생시켜 볼 것.
import pyautogui
import time
try:
print("5초 후 마우스를 화면 왼쪽 위 모서리(0,0)로 이동하세요!")
time.sleep(5)
print("마우스 이동을 감지 중...")
while True:
pyautogui.move(10, 0) # 마우스를 오른쪽으로 조금씩 이동
time.sleep(0.1)
except pyautogui.FailSafeException:
print("pyautogui.FailSafeException 발생: 마우스가 좌상단 (0,0) 근처에 도달했습니다.")
2. 기초 기능
2-1. Mouse 이동 및 click
마우스 커서의 이동 및 click 이벤트를 발생시킬 수 있음.
pyautogui.moveTo(x, y, duration=0.5):- 화면의
x,y절대좌표로 이동 (이동에 걸리는 시간 0.5초)
- 화면의
pyautogui.move(x, y, duration=0.5):- 현재 위치 기준으로 오른쪽으로
x, 아래로y만큼 이동 (상대좌표, 이동에 걸리는 시간 0.5초)
- 현재 위치 기준으로 오른쪽으로
pyautogui.click(x, y, button='left' duration=0.5):- 화면의
x,y절대좌표를 클릭 (클릭까지 걸리는 시간 0.5초) button생략시 좌클릭이나- 가급적 명시적으로 넣어줄 것.
- 화면의
pyautogui.doubleClick(x, y, duration=0.5):- 화면의
x,y절대좌표를 좌더블클릭 (클릭까지 걸리는 시간 0.5초)
- 화면의
pyautogui.rightClick(x, y, duration=0.5):- 화면의
x,y절대좌표를 우클릭 (클릭까지 걸리는 시간 0.5초)
- 화면의
pyautogui.middleClick(x, y, duration=0.5):- 화면의
x,y절대좌표를 미들클릭 (클릭까지 걸리는 시간 0.5초)
- 화면의
pyautogui.dragTo(x, y, button='left', duration=0.5):- 화면의
x,y절대좌표로 드래그 (걸리는 시간 0.5초) button키워드 인자는left,right,middle중 하나의 값을 가짐.
- 화면의
pyautogui.drag(x, y, button='left', duration=0.5):- 현재 위치 기준으로 오른쪽으로
x, 아래로y만큼 드래그 (걸리는 시간 0.5초) button키워드 인자는left,right,middle중 하나의 값을 가짐.
- 현재 위치 기준으로 오른쪽으로
pyautogui.scroll( amount_to_scroll)amount_to_scroll은int값으로- 양수(positive number)면 위로, 음수(negative number)면 아래로
아래 예제를 하기 전에 "3-2 마우스 커서 정보얻기"를 읽어볼 것:
2025.07.14 - [Python] - [Ex] PyAutoGUI - 마우스 이동 및 클릭
[Ex] PyAutoGUI - 마우스 이동 및 클릭
1-1. 실행 전 준비Windows 탐색기 또는 macOS Finder를 open해당 창 안에 다음 아이템들을 준비:왼쪽에 작은 텍스트 파일 하나 (예: test.txt)오른쪽에 폴더 하나 (예: target_folder)아이콘 보기 모드는 “아이
ds31x.tistory.com
2-2. Keyboard 입력
Virtual Key Press 이벤트를 발생시킬 수 있음.
pyautogui.write('Hello, pyautogui', 0.5)- 현재 활성화된 window의 focus가 놓인 text 입력 부분에 keyboard 입력.
Hello, pyautogui가 입력됨(둘러싸고 있는 single qutation은 제외)- 0.5 초의 delay 가 각 문자입력마다 놓임.
str객체로 일반적인 입력을 처리하나, 특수 키등을 위해 list객체로 넘길 수도 있음.- 예:
pyautogui.write(\['a','b','shiftleft','space',c'\], 0.5)
- 예:
pyautogui.KEYBOARD_KEYS를 통해 가능한 키보드 키들의 리스트를 확인가능함.
2025.07.14 - [Python] - [Ex] PyAutoGUI - 키보드 입력
[Ex] PyAutoGUI - 키보드 입력
1-1. 실행 전 준비메모장(Notepad) 또는 VS Code, Sublime Text 등 텍스트 입력이 가능한 프로그램을 실행.아래 코드를 실행하면 자동으로 키보드 입력이 수행.⸻1-2. 실습 코드: “자동으로 문장 입력하고
ds31x.tistory.com
2-3. 화면 캡쳐 및 이미지 인식
Pillow 객체를 이용하여, 캡쳐 및 pixel의 RGB값을 얻어옴.
OpenCV를 같이 설치한 경우 주어진 이미지 파일과 동일한 영역을 찾아내는 Image Recognition 기능을 활용할 때, confidence 옵션을 사용 가능.
이미지 인식의 정확도를 위해선
압축이 보통 이루어지는jpg계열보다는png등의 포맷을 사용하길 권함.
동시에 openCV를 설치하고 사용할 것.
만약 Windows에서만 실행할 코드 작성의 경우엔,
pyautogui.locateOnScreen()과 같은 이미지 인식보다
pyautogui.getActiveWindow()를 이용한 현재 활성화된 창 또는
pyautogui.getWingowsWithTilte(title)과 같은 특정 타이틀의 창을 얻어오는 기능이 보다 권장됨
(아쉽게도 macOS에선 아직 사용가능하지 않음)
이같이 창(Window)를 이용하는 방식은 다음 문서를 참고할 것: 수정 중
다음은 화면인식을 이용한 함수들임:
image = pyautogui.screenshot():- 화면을 캡쳐함.
- 반환되는 객체는
Image객체ㅣ;
img_color = pyautogui.pixel(x,y):- 특정 위치의 pixel의 RGB값을 가진 튜플 객체를 반환.
img_color은 (R,G,B)임.
bool_val = pyautogui.pixelMatchesColor(x, y, target_color):target_color은 (R,G,B)인 튜플객체로,x,y의 pixel값이 이와 같으면True를 반환.- 아니면
False를 반환.
box = pyautogui.locateOnScreen(img_file_path):img_file_path와 정확히 일치하는 위치를 named tuple 객체 (Box)로 반환.confidnece옵션을 통해 화면과 완벽하게 일치하지 않더라도 어느정도 유사한지를 지정하여 찾을 수 있음.cv2.matchTemplate()에 기반한 similarity의 threshold값을confidence로 지정가능confidence는[0.0 ,1.0]의 값으로 지정.- 기본은
None으로confidence=1.0과 같음
box는Box라는 이름의 named tuple객체로left,top,width,heightattribute를 가짐.- 정확히 일치하는 영역이 없을 경우,
ImageNotFoundException을 raise. - 일부 이전 버전은
None을 반환하는 것이 기본으로 되어 있으니 확인하고 사용할 것.ImageNotFoundException을 대신 사용하려면,pyautogui.useImageNotFoundException()을 미리 호출할 것.
- 인자로 넘겨지는 이미지와 같은 영역이 여러 개 있는 경우엔
locateAllOnScreen()을 사용할 것.
gen = pyautogui.locateAllOnScreen(img_file_path):img_file_path와 정확히 일치하는 복수의 위치를 iterate 시킬 수 있는 generator객체를 반환.l = list(gen)등을 통해 list로 만들면, 일치하는 위치에 대한 x,y,w,h로 구성된 튜플 객체를 item으로 가지는 리스트 객체를 얻음.
pyautogui.locateOnScreen의 경우
dpi등의 차이로 인해 이미지의 size가 다른 경우는
다른 이미지로 판정함.
confidence도 pixel값 간의 미세한 차이를 용인하는 것이지 이미지의 가로 세로 scale의 차이를 고려하진 못함.
크기 차이 등을 고려하려면, OpenCV를 직접 사용하거나, DL 기반의 Image Location을 사용해야 함.
간단한 예제
import pyautogui
# 특정 이미지가 화면 어딘가에 있을 때 위치 탐색
location = pyautogui.locateOnScreen('target.png', confidence=0.8)
if location:
# 이미지의 중앙 좌표 계산
center = pyautogui.center(location)
print(f"이미지 위치: {center}")
# 해당 위치로 마우스 이동
pyautogui.moveTo(center.x, center.y, duration=0.5)
# 필요하다면 클릭도 수행 가능
pyautogui.click()
else:
print("이미지를 찾을 수 없습니다.")
2025.07.15 - [Python] - [Ex] PyAutoGUI - 화면 캡처 및 이미지 인식
[Ex] PyAutoGUI - 화면 캡처 및 이미지 인식
1-1. 실행 전 준비화면에서 버튼 또는 아이콘을 캡처하여 target.png로 저장.해당 버튼/아이콘이 현재 화면에 그대로 떠 있도록 유지.target.png는 Python 코드와 같은 폴더에 둘 것.가급적 opencv를 설치하
ds31x.tistory.com
2-4. Hotkey 입력
아래의 기타 기능에서 다루는 keyDown과 keyUp을 이용하는 방법도 있으나 pyautogui.hotkey()를 권장함
- 특수키등의 지정을 할때나 누를 키는 소문자로 표시.
- 대문자 입력이 필요하면,
shift키와 함께 처리:pyautogui.hotkey('shift', 'a') # 대문자 'A' 입력
예: 복사를 위한 CTRL+C는 다음으로 처리가능.
pyautogui.hotkey('ctrl', 'c')
# pyautogui.keyDown('ctrl')
# pyautogui.keyDown('c')
# pyautogui.keyUp('c')
# pyautogui.keyUp('ctrl')
2025.07.15 - [Python] - [Ex] PyAutoGUI - hotkey 조합 입력하기
[Ex] PyAutoGUI - hotkey 조합 입력하기
1-1. 사전 준비텍스트 입력 또는 복사/붙여넣기 등의 단축키 동작을 확인할 수 있는 프로그램 필요Windows: 메모장 (notepad)macOS: 텍스트 편집기 (TextEdit) 또는 메모 앱1-2. 코드import pyautoguiimport subprocess
ds31x.tistory.com
참고: 키를 나타내는 문자열 표
| 키 문자열 (Key String) | 의미 (Meaning) |
| 'a', 'b', '1', '%' 등 | 일반 문자 및 숫자 키 |
'enter', 'return', '\n' |
엔터(Enter) 키 |
'esc' |
ESC 키 |
'shiftleft', 'shiftright' |
좌/우 SHIFT 키 |
'altleft', 'altright' |
좌/우 ALT 키 |
'ctrlleft', 'ctrlright' |
좌/우 CTRL 키 |
'tab', '\t' |
TAB 키 |
'backspace', 'delete' |
백스페이스 및 삭제 키 |
'pageup', 'pagedown' |
페이지 업/다운 키 |
'home', 'end' |
HOME / END 키 |
'up', 'down', 'left', 'right' |
방향키 (↑ ↓ ← →) |
'f1' ~ 'f12' |
F1 ~ F12 함수 키 |
'volumemute', 'volumedown', 'volumeup' |
볼륨 음소거 / 줄이기 / 높이기 키 |
'pause' |
일시정지(PAUSE) 키 |
'capslock', 'numlock', 'scrolllock' |
CAPS, NUM, SCROLL LOCK 키 |
'insert' |
INSERT (INS) 키 |
'printscreen' |
프린트 스크린 키 |
'winleft', 'winright' |
윈도우 키 (Windows 전용) |
'command' |
Command(⌘) 키 (macOS 전용) |
'option' |
Option(⌥) 키 (macOS 전용) |
'space' |
스페이스(공백) 키 |
'apps' |
앱 메뉴(우클릭) 키 (일부 키보드에서 지원) |
3. 기타 기능
3-1. Message Box사용하기
PyMsgBox에 기반한 TkInter를 이용한 Message Box 기능을 지원함.
단, Python의 공식 iteractive shell에서만 제대로 동작하고, IPython 및 IPython 기반의 shell에선 정상동작하지 않으니 주의할 것.
TkInter 계열은 IPython 계열과 궁합이 매우 안좋음.
지원하는 함수는 다음과 같음:
pyautogui.alert(text): 메시지를 표시하고 확인 버튼 하나만 있는 알림 창을 띄움.'OK'가 반환pyautogui.confirm(text): 메시지와 함께 확인/취소 버튼이 있는 창을 띄우고, 클릭한 버튼의 이름을 문자열 ('OK'또는'Cancel')로 반환.pyautogui.prompt(text): 메시지와 함께 입력 필드를 제공하고, 사용자가 입력한 문자열을 반환 (취소시None반환).pyautogui.password(text): 입력 필드에 입력한 내용을 별표(*)로 가려서 비밀번호 등의 민감한 정보를 입력받음. 나머진prompt와 같음.
2025.07.15 - [Python] - [Ex] PyAutoGUI - MessageBox
[Ex] PyAutoGUI - MessageBox
1-1. 실행 전 준비특별한 창이나 환경 필요 없음1-2. 예제 코드import pyautogui# Alertresponse1 = pyautogui.alert(text='자동화 시작 전에 준비되었나요?', title='알림', button='확인')print('alert 응답:', response1)# Confir
ds31x.tistory.com
3-2. 마우스 커서 정보 얻기
pyautogui.mouseInfo()를 사용할 경우, 현재 마우스 커서의 좌표(x, y)와 해당 위치 픽셀의 색상(RGB)을 실시간으로 확인할 수 있는 작은 창을 확인할 수 있음.이는 PyAutoGUI에 포함된 유틸리티 중 하나임.
macOS에서는 실행권한 설정을 하지 않은 경우, 정상 동작 하지 않을 수 있음.
실행할 terminal에 스크린캡쳐 권한을 줘야 함.

pixel의 RGB는 macOS에서는 python이 실행되는 terminal등에 "화면 녹화 권한"을 준 경우에도 얻을 수 없음:
- "NA_on_macOS" 로 뜸: Not Available
- macOS 13 Ventura 이상 및 Intel CPU가 아닌 경우 동작 안함.
- macOS의 NSApplication은 macOS의 AppKit 프레임워크에 속한 Objective-C 클래스를 가리킴.
3-3. 마우스 기본 입력
pyautogui.position()- 현재 마우스 커서의 화면 좌표를 (x, y) 형태의 named tuple
Point객체로 반환 Point는x,y를 attribute로 가짐
- 현재 마우스 커서의 화면 좌표를 (x, y) 형태의 named tuple
pyautogui.mouseDown(),pyautogui.mouseUp()mouseDown()은 마우스 버튼을 누른 상태로 유지하는 동작을 시뮬레이션.mouseUp(): 눌린 마우스 버튼을 떼는 동작을 시뮬레이션.x,y,button를 통해 세부 조정 가능.
import pyautogui
# 마우스 왼쪽 버튼을 누르고 유지
pyautogui.mouseDown(x=100, y=200, button='left')
# ... 드래그할 수 있는 작업 수행 ...
# 마우스 버튼을 떼기
pyautogui.mouseUp(button='left')
3-4. 키보드 기본 입력
pyautogui.keyDown(key),pyautogui.keyUp(key)keyDown(key)은 특정 키를 누른 상태로 유지하는 동작을 시뮬레이션.keyUp(key)은 눌린 키를 떼는 동작을 시뮬레이션.key인자를 통해'shift','ctrl','a','enter'등 다양한 키를 지정 가능.
pyautogui.press()- 지정한 키를 한 번 누르고 떼는 동작을 자동으로 수행.
key인자에'enter','space','tab','a','1'등 키를 나타내는 문자열을 지정.press()는keyDown()이후keyUp()을 자동으로 실행하는 함수임.press(keys, presses=N)형태로 여러 번 누르기도 가능.
import pyautogui
# Shift 누른 상태에서 A 입력 (대문자 A)
pyautogui.keyDown('shift')
pyautogui.press('a')
pyautogui.keyUp('shift')
# Enter 키 3번 누르기
pyautogui.press('enter', presses=3)
3-5. 화면 정보 얻기
PyAutoGUI는 주로 "주모니터(main monitor")를 기반으로 적용하는 것을 추천함.
size = pyautogui.size()- 화면 크기 정보를 가지는 Size 라는 named tuple의 객체를 반환.
Size는width와height를 attribute로 가짐.
같이보면 좋은 자료들
2025.04.04 - [Python] - [Py] collections.namedtuple-Factory Function
[Py] collections.namedtuple-Factory Function
1. 팩토리 함수(Factory Function)란?팩토리 함수는 객체 생성 과정을 추상화하여 객체를 생성하는 함수 를 가리킴.즉, 객체를 직접 생성하는 대신 함수를 호출하여 객체를 생성하는 방식으로 다음과
ds31x.tistory.com
2025.07.14 - [Python] - [Ex] Input_Recoder and Replayer
[Ex] Input_Recoder and Replayer
record_user_input_full.py"""마우스와 키보드 입력을 실시간으로 기록하여 JSON 파일로 저장하는 프로그램핵심 특징:- 이벤트 후처리 방식으로 100% 정확한 드래그 감지- mouse_down과 mouse_up 사이의 모든 move
ds31x.tistory.com
'Python' 카테고리의 다른 글
| [Ex] PyAutoGUI - 마우스 이동 및 클릭 (0) | 2025.07.14 |
|---|---|
| [Ex] Input_Recoder and Replayer (0) | 2025.07.14 |
| [Py] String Interning (0) | 2025.07.07 |
| cv.undistort()와 cv.initUndistortRectifyMap() + cv.remap() (0) | 2025.07.04 |
| cv.getOptimalNewCameraMatrix() (0) | 2025.07.04 |