PyAutoGUI moveTo x y duration vs moveRel dx dy 차이와 예제 완벽 정리
🖱️ 단 한 번에 헷갈림 끝 이동 좌표 개념부터 안전 설정까지 핵심만 정리
GUI 자동화를 시작하면 마우스를 어느 좌표로, 얼마나 부드럽게 옮길지부터 막히는 경우가 많습니다.
스크립트는 정상인데 커서가 엉뚱한 곳으로 튀거나, 상대 이동과 절대 이동을 혼동해 클릭 지점이 어긋나기도 하죠.
이 글은 그런 시행착오를 줄이고 빠르게 자동화 루틴을 안정화하려는 분들을 위한 길잡이로 구성했습니다.
초심자도 바로 따라 할 수 있도록 좌표 체계와 함수 차이를 쉬운 예제로 설명하고, 실전에서 바로 쓰는 팁까지 곁들였습니다.
핵심은 두 가지 함수의 성격을 정확히 구분하는 것입니다.
moveTo(x, y, duration)는 화면의 특정 절대 좌표로 이동하고, moveRel(dx, dy)는 현재 위치를 기준으로 상대적 오프셋만큼 이동합니다.
같은 “이동”이라도 목적에 따라 선택이 갈리며, 화면 해상도 변화나 창 위치 이동에 얼마나 강인한지도 달라집니다.
여기에 안전 종료를 위한 failsafe, 좌표 확인법, 트윈 easing 적용 팁을 더해 실제 자동화 작업에서 실수를 최소화하는 방법을 정리했습니다.
📋 목차
🖱️ moveTo x y duration 동작 원리
PyAutoGUI의 moveTo(x, y, duration=None)는 화면의 절대 좌표로 마우스를 이동시키는 함수입니다.
좌표계의 원점은 모니터의 좌측 상단이며, x는 오른쪽으로 갈수록 증가하고 y는 아래로 갈수록 증가합니다.
즉, 해상도와 상관없이 화면 전체에서 특정 픽셀 위치를 정확히 가리키고 싶을 때 moveTo를 사용하면 됩니다.
duration을 지정하면 해당 시간 동안 선형 혹은 이징 곡선을 따라 부드럽게 이동하며, 값을 생략하면 즉시 이동합니다.
기본 사용 패턴은 다음 흐름을 갖습니다.
첫째, 이동할 목표 좌표를 정합니다.
둘째, 필요 시 이동 시간을 설정해 자연스러운 마우스 움직임을 만듭니다.
셋째, 클릭이나 드래그 같은 후속 동작을 이어 붙여 작업을 완성합니다.
이 과정에서 pyautogui.PAUSE를 활용하면 함수 호출 사이에 자동 지연을 넣어 안정성을 높일 수 있고, 좌측 상단 모서리로 마우스를 순간 이동하면 FailSafeException이 발생해 긴급 중단되는 보호 장치도 기본 제공됩니다.
import pyautogui as pg
# 1) 절대 좌표로 즉시 이동
pg.moveTo(100, 200)
# 2) 0.6초 동안 부드럽게 이동
pg.moveTo(500, 300, duration=0.6)
# 3) 이징(tween) 적용 예시: easeInOutQuad
from pyautogui import easeInOutQuad
pg.moveTo(900, 500, duration=0.8, tween=easeInOutQuad)
# 4) 후속 동작: 이동 후 클릭
pg.moveTo(1200, 100, duration=0.4)
pg.click()
# 5) 전역 지연과 실패 방지 설정
pg.PAUSE = 0.1 # 모든 호출 사이 0.1초 대기
pg.FAILSAFE = True # 좌상단(0,0) 이동 시 FailSafeException 발생
💎 핵심 포인트:
절대 좌표 기반의 moveTo는 픽셀 단위로 정확한 지점을 겨냥할 때 강력하지만, 창 위치나 해상도가 바뀌면 목표가 달라질 수 있습니다.
UI가 자주 이동한다면 이미지 탐지(locateOnScreen)나 앵커 요소 기준의 상대 이동과 함께 조합해 신뢰도를 높이는 전략이 유용합니다.
- 🧭원점은 화면 좌측 상단 (0, 0)이며, y는 아래로 증가합니다.
- ⏱️duration 지정 시 사람이 움직이는 듯한 자연스러운 이동을 연출할 수 있습니다.
- 🛡️FAILSAFE가 활성화되어 있으면 좌상단으로 커서를 밀면 즉시 중단됩니다.
- 🧪좌표는 pg.position()으로 실시간 확인하고, 다른 해상도에서 재검증합니다.
💬 절대 좌표는 언제나 동일한 픽셀을 겨냥하지만, 창이 이동하거나 스케일링이 바뀌면 대상 버튼이 그 픽셀에 없을 수 있습니다.
이럴 땐 이미지 매칭이나 윈도우 핸들 기반의 위치 보정과 함께 사용하는 것이 안전합니다.
💡 TIP: 여러 동작을 연속 실행할 때는 pg.PAUSE에 소량의 지연을 주면 UI 렌더링 지연으로 인한 오작동을 줄일 수 있습니다.
📐 moveRel dx dy 상대 이동 이해
PyAutoGUI의 moveRel(dx, dy, duration=None)은 현재 마우스 포인터 위치를 기준으로 상대적 거리를 이동하는 방식입니다.
절대 좌표가 아닌, 지금 커서가 놓인 지점에서 x축과 y축을 얼마나 이동시킬지를 지정합니다.
예를 들어, (100, 200) 위치에 마우스가 있을 때 moveRel(50, 0)을 실행하면 오른쪽으로 50픽셀 이동하여 (150, 200)에 도달합니다.
이 방식은 창이나 버튼의 위치가 바뀔 수 있는 환경에서 특히 유용합니다.
예를 들어 특정 버튼의 왼쪽 상단을 기준으로 마우스를 맞춘 뒤 일정 픽셀만큼 이동해 클릭해야 할 때, 상대 이동은 보다 안정적인 제어를 가능하게 합니다.
또한 절대 좌표를 미리 계산하지 않아도 되므로 코드 유지보수도 간단해집니다.
import pyautogui as pg
# 현재 위치에서 오른쪽 100픽셀, 아래로 50픽셀 이동
pg.moveRel(100, 50)
# 1초 동안 부드럽게 상대 이동
pg.moveRel(-200, 0, duration=1.0)
# 마우스를 이동한 뒤 클릭
pg.moveRel(0, 80, duration=0.5)
pg.click()
| dx, dy 값 | 결과 동작 |
|---|---|
| (100, 0) | 오른쪽으로 100픽셀 이동 |
| (0, -50) | 위쪽으로 50픽셀 이동 |
| (-30, 30) | 왼쪽으로 30, 아래로 30픽셀 이동 |
💎 핵심 포인트:
상대 이동은 기준점이 되는 요소의 위치를 먼저 찾고, 그 위치에서의 오프셋을 계산하는 데 최적화되어 있습니다.
반복 작업을 자동화할 때는 절대 좌표보다 더 안정적인 선택이 될 수 있습니다.
⚠️ 주의: 현재 위치가 어디인지 정확히 파악하지 못하면 상대 이동은 엉뚱한 좌표로 이어질 수 있습니다.
스크립트 실행 전 pg.position()으로 현재 좌표를 확인하는 습관이 필요합니다.
⚡ moveTo vs moveRel 선택 기준과 성능 팁
두 함수는 같은 ‘마우스 이동’이라는 목적을 공유하지만 활용 맥락과 성능 최적화 측면에서 중요한 차이를 보입니다.
moveTo는 정확히 지정한 화면 좌표로 이동하는 반면, moveRel은 현재 위치를 기준으로 상대적인 거리를 계산해 이동합니다.
즉, 절대 좌표를 다루는지, 상대 좌표를 다루는지가 핵심 차이입니다.
⚙️ 선택 기준
– moveTo는 해상도와 창 위치가 고정된 환경에서 신뢰도가 높습니다.
로그인 버튼, 특정 메뉴 아이콘처럼 항상 같은 좌표에 존재하는 요소를 클릭할 때 적합합니다.
– moveRel은 기준점이 잡힌 상태에서 일정 거리만큼 떨어진 지점을 클릭해야 할 때 유리합니다.
예를 들어 테이블 셀 안의 버튼이나 리스트 아이템처럼 위치가 상대적으로 달라지는 경우, 기준 요소의 위치를 잡은 뒤 오프셋 이동으로 접근하는 것이 더 안정적입니다.
🚀 성능 팁
마우스 이동이 많아지면 스크립트 속도가 크게 떨어질 수 있습니다.
이럴 땐 다음 팁을 적용해 효율성을 높일 수 있습니다.
- ⚡duration 값을 최소화하면 이동 속도를 크게 향상시킬 수 있습니다.
- 🧭이동이 꼭 필요 없는 경우, click(x, y)처럼 직접 좌표 클릭을 활용하면 성능이 더 좋아집니다.
- 🛡️테스트 환경과 실제 실행 환경의 해상도가 다를 수 있으니 항상 좌표 보정이나 이미지 매칭을 함께 고려하세요.
💬 클릭이 목적이라면 마우스를 직접 이동시키는 대신 pg.click(x, y)처럼 좌표를 곧바로 지정하는 것이 더 효율적일 때가 많습니다.
💎 핵심 포인트:
절대 이동과 상대 이동은 상황에 따라 장단점이 분명합니다.
정적인 환경에는 moveTo, 변동성이 있는 UI 환경에는 moveRel을 선택하는 것이 자동화의 안정성을 높이는 핵심 전략입니다.
🧪 실전 예제 절대 좌표와 상대 좌표 스크립트
이제 실제 상황에서 moveTo와 moveRel을 어떻게 활용할 수 있는지 살펴보겠습니다.
예제는 단순한 버튼 클릭 자동화부터 상대 좌표를 활용한 반복 동작까지 포함합니다.
실행 전 반드시 마우스 위치를 pg.position()으로 확인하고, UI 배치가 바뀌지 않았는지 점검하는 것이 중요합니다.
🖱️ 절대 좌표 기반 클릭
import pyautogui as pg
# 로그인 버튼 절대 좌표로 이동 후 클릭
pg.moveTo(800, 450, duration=0.4)
pg.click()
위 코드는 해상도와 창 위치가 고정되어 있을 때 유용합니다.
하지만 화면 스케일이 바뀌면 좌표가 달라질 수 있으므로 테스트 환경과 동일해야 신뢰도가 유지됩니다.
📐 상대 좌표 반복 동작
# 리스트 항목을 순서대로 클릭하는 예시
import pyautogui as pg
# 첫 번째 항목 좌표로 이동
pg.moveTo(600, 300)
pg.click()
# 아래 항목 5개를 순차 클릭
for i in range(5):
pg.moveRel(0, 40, duration=0.3) # 아래로 40픽셀씩 이동
pg.click()
이 예시는 테이블이나 리스트 UI처럼 항목이 규칙적으로 배치된 경우에 매우 효과적입니다.
기준점만 찾으면 상대 이동으로 반복 처리가 가능하므로 유지보수가 훨씬 쉬워집니다.
💎 핵심 포인트:
절대 좌표는 특정 지점 타깃팅에, 상대 좌표는 반복 패턴에 최적화되어 있습니다.
실무에서는 두 방법을 혼합해 쓰는 경우가 많으며, 상황에 맞는 전략적 선택이 필요합니다.
💡 TIP: 상대 좌표를 사용할 때는 반복 루프에서의 누적 이동 거리를 계산해야 합니다.
한 번의 이동 후 위치가 바뀌므로, 원하는 좌표를 정확히 얻으려면 누적 좌표를 고려하세요.
🛡️ 오류 방지 failsafe 좌표확인과 대안 API
자동화 스크립트를 실행할 때 의도치 않은 좌표 이동은 치명적인 문제를 일으킬 수 있습니다.
예를 들어 잘못된 좌표로 이동해 다른 버튼을 클릭하거나 무한 루프에 빠질 수 있죠.
PyAutoGUI는 이런 상황을 대비해 FailSafe와 좌표 확인 기능을 제공합니다.
🛑 FailSafe 기능
PyAutoGUI는 기본적으로 마우스를 화면의 좌측 상단 (0,0)으로 이동시키면 pyautogui.FailSafeException을 발생시켜 모든 동작을 중단합니다.
이는 자동화 도중 오류가 발생했을 때 즉시 멈출 수 있는 안전장치입니다.
import pyautogui as pg
pg.FAILSAFE = True # 기본값 True
try:
pg.moveTo(9999, 9999, duration=2) # 잘못된 좌표 예시
except pg.FailSafeException:
print("FailSafe 작동! 스크립트 중단")
📍 좌표 확인 방법
좌표는 항상 환경마다 다를 수 있으므로 코드 작성 전 실제 좌표를 확인해야 합니다.
PyAutoGUI는 position() 함수를 제공해 마우스의 현재 위치를 즉시 출력할 수 있습니다.
import pyautogui as pg
# 마우스 현재 좌표 출력
print(pg.position())
🔄 대안 API 활용
좌표 기반 이동은 해상도 변화나 UI 레이아웃 변화에 취약합니다.
이럴 땐 이미지 매칭 기반의 locateOnScreen()이나 center() 함수로 버튼 영역을 탐지한 뒤 클릭하는 것이 더 안정적입니다.
import pyautogui as pg
# 화면에서 특정 이미지 탐색 후 중앙 좌표로 이동
button = pg.locateOnScreen("login.png")
if button:
pg.moveTo(pg.center(button))
pg.click()
💎 핵심 포인트:
FailSafe와 좌표 확인을 반드시 습관화해야 합니다.
그리고 해상도에 따라 달라질 수 있는 절대 좌표 의존도를 줄이려면 이미지 기반 탐색이나 요소 기준 상대 좌표 이동을 함께 사용하는 것이 안정성을 크게 높여줍니다.
❓ 자주 묻는 질문 (FAQ)
moveTo와 moveRel의 가장 큰 차이는 무엇인가요?
duration 값을 지정하지 않으면 어떤 일이 생기나요?
부드러운 움직임을 원할 때만 값을 지정하세요.
상대 이동을 반복할 때 누적 오차가 생기지 않나요?
이를 방지하려면 중간에 position()으로 확인하거나 기준점을 다시 잡는 방법을 씁니다.
FailSafe 기능을 끌 수 있나요?
다만 안전성을 위해 기본값(True) 유지가 권장됩니다.
moveTo 대신 click(x, y)를 쓰면 뭐가 다른가요?
이동 애니메이션이 필요 없을 때 더 빠르고 효율적입니다.
해상도가 바뀌면 절대 좌표는 어떻게 되나요?
이미지 매칭이나 상대 좌표 방식을 병행하는 것이 안정적입니다.
moveRel 사용 시 음수 값도 가능한가요?
마우스 이동을 사람이 쓰는 것처럼 자연스럽게 만들 수 있나요?
🖥️ PyAutoGUI 마우스 이동 함수 활용 정리
PyAutoGUI의 moveTo와 moveRel은 비슷해 보이지만 절대 좌표 이동과 상대 좌표 이동이라는 중요한 차이를 가지고 있습니다.
정적인 화면에서는 moveTo가, 반복 패턴이나 상대적인 오프셋이 필요한 경우에는 moveRel이 더 적합합니다.
또한 duration과 tween 옵션으로 사람처럼 자연스러운 이동을 구현할 수 있으며, FailSafe와 좌표 확인 기능을 활용하면 안전성을 강화할 수 있습니다.
실무에서는 두 함수를 혼합해 쓰는 경우가 많습니다.
절대 좌표로 기준점을 잡고, 상대 좌표로 반복 클릭을 수행하는 식이 대표적입니다.
여기에 이미지 매칭 기반의 locateOnScreen을 더하면 해상도나 UI 변경에도 안정적으로 동작하는 자동화 스크립트를 완성할 수 있습니다.
즉, 상황에 따라 올바른 함수를 선택하고 보조 기능을 적절히 조합하는 것이 핵심 전략입니다.
🏷️ 관련 태그 : PyAutoGUI, 파이썬자동화, 마우스이동, moveTo, moveRel, GUI자동화, 프로그래밍팁, 좌표기반스크립트, 파이썬기초, 자동화스크립트