메뉴 닫기

파이썬 PyAutoGUI dragTo dragRel 사용법, button duration tween으로 자연스러운 드래그

파이썬 PyAutoGUI dragTo dragRel 사용법, button duration tween으로 자연스러운 드래그

🖱️ 클릭처럼 보이는 드래그, 사람 손맛으로 구현하는 핵심 옵션 가이드

GUI 자동화가 어색하게 느껴지는 가장 큰 이유는 마우스가 뚝딱 이동하고 즉시 드래그를 끝내기 때문입니다.
툴을 바꾸지 않아도 파이썬의 PyAutoGUI만으로 움직임의 속도와 가속을 조절해 훨씬 자연스러운 드래그를 만들 수 있습니다.
특히 dragTo와 dragRel은 목적지 기준 또는 현재 위치 기준으로 끌기를 제어하고, button은 어떤 마우스 버튼을 눌러 끌지 결정하며, duration과 tween은 시간과 가속 곡선을 담당합니다.
이 글은 위 옵션들을 중심으로 실제 자동화 작업에서 바로 써먹을 수 있는 구성으로 정리해 품질과 안정성을 동시에 챙길 수 있도록 도와드립니다.

드래그가 필요한 상황은 파일 선택, 슬라이더 조절, 캔버스 객체 이동, 타임라인 편집 등 생각보다 다양합니다.
하지만 좌표만 맞추면 끝이라는 접근은 금방 한계에 부딪힙니다.
의도치 않은 윈도 창 포커스 변화나 느린 시스템 환경에서도 매끄럽게 동작하려면, 버튼을 어떻게 누르고 떼는지, 드래그 속도를 어떻게 분배하는지, 한 프레임씩 어느 정도의 거리로 이동하는지까지 신경 써야 합니다.
아래 목차를 따라가면 dragTo와 dragRel의 차이, button 값의 선택 기준, duration과 tween 조합으로 사람 같은 동작을 만드는 법, 그리고 실전에서 안전하게 적용하는 설정까지 한 번에 정리할 수 있습니다.



🖱️ PyAutoGUI dragTo 사용법

dragTo는 화면의 절대 좌표로 커서를 부드럽게 이동시키며 버튼을 누른 상태로 끌어주는 함수입니다.
파일을 다른 폴더로 옮기거나, 그래픽 편집기에서 레이어를 이동하는 등 목적지가 확정되어 있을 때 가장 직관적으로 사용합니다.
핵심 매개변수는 x, y(혹은 (x, y) 튜플), duration(이동 시간), button(눌러서 끄는 마우스 버튼), tween(가속도 곡선)입니다.
이 네 가지를 조합하면 사람 손처럼 출발은 천천히, 중간은 빠르게, 도착은 다시 느리게 같은 느낌을 줄 수 있습니다.

🧩 dragTo 시그니처와 기본 동작

CODE BLOCK
import pyautogui as pag

# 절대 좌표 (x=1200, y=420)까지 왼쪽 버튼으로 0.6초 동안 드래그
# easeInOutQuad로 사람 같은 가속/감속을 적용
pag.dragTo(1200, 420, duration=0.6, button='left', tween=pag.easeInOutQuad)

dragTo는 호출 즉시 button으로 지정한 버튼을 누른 상태를 만들고, 지정 좌표까지 커서를 이동한 뒤 버튼을 놓습니다.
duration을 지정하지 않으면 시스템 속도에 따라 매우 빠르게 이동하므로 자동화 대상 앱이 이동을 놓칠 수 있습니다.
일반적으로 0.2초에서 0.8초 사이가 자연스럽고 안정적입니다.
tween은 이동 속도의 분배를 결정하는 함수로, 기본 선형(linear)보다 easeInOutQuad 또는 easeInOutSine이 실제 사용감이 좋습니다.

⚙️ 주요 매개변수 요약

매개변수 설명
x, y 이동할 절대 좌표입니다.
정수 또는 (x, y) 튜플을 사용합니다.
duration 이동에 걸리는 시간(초)입니다.
값이 클수록 부드럽고 안정적입니다.
button ‘left’ ‘right’ ‘middle’ 중 선택합니다.
드래그에 사용할 버튼을 지정합니다.
tween 속도 곡선을 결정하는 함수입니다.
pag.easeInOutQuad, pag.easeInOutSine 등 제공됩니다.

🧪 좌표 찾기와 실전 패턴

CODE BLOCK
import pyautogui as pag
# 안전장치: 마우스를 화면 왼쪽 위(0,0)로 빠르게 이동하면 예외 발생
pag.FAILSAFE = True
pag.PAUSE = 0.05  # 각 동작 사이 소폭 지연으로 안정성 향상

# 1) 시작점 클릭 후 대상까지 드래그
pag.click(320, 640, button='left')
pag.dragTo(1100, 640, duration=0.5, button='left', tween=pag.easeInOutQuad)

# 2) 슬라이더/타임라인처럼 미세 조정이 필요하면 시간을 늘려 정밀 제어
pag.dragTo(900, 642, duration=0.9, button='left', tween=pag.easeInOutSine)

💡 TIP: 화면 배율이나 앱 레이아웃이 바뀌면 절대 좌표가 틀어질 수 있습니다.
이미지 매칭(pyautogui.locateOnScreen)으로 대상 위치를 찾은 뒤 center 좌표를 받아 dragTo에 전달하면 견고해집니다.

  • 🖱️duration은 0.2~0.8초 사이부터 테스트합니다.
  • 🎚️tween은 easeInOut 계열을 우선 검토합니다.
  • 🧭절대 좌표 사용 시 해상도/배율을 고정합니다.
  • 🛟pag.FAILSAFE를 활성화해 비상 정지를 확보합니다.

⚠️ 주의: 일부 앱은 드래그 시작 지점에서 클릭 유지 시간을 요구합니다.
필요하다면 pag.mouseDown(…), dragTo(…, button=None), pag.mouseUp(…) 패턴으로 세밀하게 제어하세요.

🧭 PyAutoGUI dragRel 차이점

dragRel은 dragTo와 달리 현재 커서 위치를 기준으로 상대적인 거리를 이동하는 함수입니다.
즉, “이 좌표로 이동해”가 아니라 “지금 자리에서 몇 픽셀만큼 이동해”라는 방식으로 동작합니다.
따라서 dragRel은 절대 좌표에 구애받지 않고, 현재 상황에 따라 반복적이거나 패턴화된 동작을 쉽게 구현할 수 있다는 장점이 있습니다.

📐 dragRel 기본 사용 예시

CODE BLOCK
import pyautogui as pag

# 현재 위치에서 오른쪽으로 200px, 아래로 100px 드래그
pag.dragRel(200, 100, duration=0.5, button='left')

# 현재 위치에서 왼쪽으로 300px, 위로 150px 드래그
pag.dragRel(-300, -150, duration=0.7, button='left', tween=pag.easeInOutSine)

dragRel은 특히 같은 작업을 여러 번 반복해야 할 때 효율적입니다.
예를 들어 파일을 일정 간격으로 정렬하거나, 타임라인 클립을 같은 거리만큼 이동시킬 때 dragRel이 유용합니다.
좌표를 일일이 계산할 필요 없이 이동할 상대 거리만 지정하면 되므로 코드 가독성과 유지보수성도 향상됩니다.

🔄 반복 동작과 패턴 구현

dragRel의 장점은 반복 루프와 결합했을 때 더욱 빛납니다.
예를 들어 동일한 간격으로 여러 번 드래그해야 한다면 dragRel에 상대 좌표를 전달하는 방식으로 간단히 구현할 수 있습니다.

CODE BLOCK
# 가로로 5개의 상자를 일정 간격(150px)으로 드래그
for i in range(5):
    pag.dragRel(150, 0, duration=0.4, button='left')

이 방식은 반복적인 GUI 자동화 시 특히 강력합니다.
dragTo로는 매번 절대 좌표를 계산해야 하지만, dragRel을 사용하면 단순히 이동할 거리만 지정하면 됩니다.
또한 화면 해상도나 창의 위치가 변동될 때도 코드 수정이 최소화되는 장점이 있습니다.

💡 TIP: dragRel은 마우스를 시작점으로 정확히 이동시킨 후 실행해야 원하는 결과를 얻을 수 있습니다.
실행 전 pag.moveTo()pag.click()으로 기준점을 맞춰주세요.

  • 📍dragRel은 현재 커서 위치를 기준으로 작동합니다.
  • ⏱️duration을 늘리면 안정성과 자연스러움이 향상됩니다.
  • 📦반복 루프와 결합하면 일괄적인 드래그 작업이 용이합니다.
  • 🛡️dragTo 대비 해상도 변화에 더 유연하지만, 시작점 설정이 중요합니다.

⚠️ 주의: dragRel은 상대 좌표 누적 이동이므로 루프를 돌 때 예상치 못한 위치로 벗어날 수 있습니다.
루프 시작 전에 항상 커서를 기준점으로 이동시켜야 합니다.



🖲️ button 매개변수 왼쪽 오른쪽 중간

PyAutoGUI의 dragTodragRel은 공통적으로 button 매개변수를 제공합니다.
이는 마우스의 어느 버튼을 눌러 드래그할지를 지정하는 옵션으로, 보통은 ‘left’가 기본값입니다.
하지만 상황에 따라 ‘right’나 ‘middle’ 버튼이 필요할 때도 있어 활용 범위가 넓습니다.

🖱️ button 값 종류

설명
‘left’ 왼쪽 버튼으로 드래그합니다.
파일 이동, 일반적인 선택 작업에 가장 많이 사용됩니다.
‘right’ 오른쪽 버튼을 누른 상태에서 드래그합니다.
일부 전문 소프트웨어에서 컨텍스트 기능이나 특수 드래그 동작에 사용됩니다.
‘middle’ 마우스 휠 버튼을 눌러 드래그합니다.
웹 브라우저 스크롤, CAD/PDF 뷰어에서 패닝(panning) 기능을 제어할 때 자주 활용됩니다.

🧪 예제 코드

CODE BLOCK
import pyautogui as pag

# 왼쪽 버튼으로 드래그
pag.dragTo(800, 400, duration=0.5, button='left')

# 오른쪽 버튼으로 드래그
pag.dragRel(150, 0, duration=0.5, button='right')

# 가운데 버튼(휠)으로 드래그
pag.dragTo(600, 600, duration=0.7, button='middle')

위 예제에서 알 수 있듯, 단순히 button 인자만 바꿔주면 동일한 drag 함수로 다른 동작을 제어할 수 있습니다.
특히 CAD 툴처럼 가운데 버튼 드래그로 화면 이동(panning)을 지원하는 경우 자동화 작업의 효율성이 크게 올라갑니다.

💡 TIP: 일반적인 OS 환경에서는 오른쪽 버튼 드래그가 예상치 못한 컨텍스트 메뉴를 발생시킬 수 있습니다.
자동화 스크립트를 실행하기 전에 해당 소프트웨어의 드래그 동작 방식을 확인하는 것이 안전합니다.

  • 🖱️left는 기본값으로 가장 보편적입니다.
  • 🖲️right는 특정 전문 프로그램에서만 유효합니다.
  • 🎡middle은 CAD, 뷰어 등에서 화면 이동에 자주 사용됩니다.
  • 🛡️button 설정 전 대상 프로그램의 드래그 동작을 반드시 확인하세요.

⚠️ 주의: 일부 환경에서는 middle 버튼 드래그가 스크롤 이벤트와 혼동될 수 있습니다.
테스트를 통해 확실히 동작을 검증한 뒤 사용하는 것이 좋습니다.

⏱️ duration tween으로 자연스러운 이동

자동화된 마우스 드래그가 가장 부자연스럽게 느껴지는 이유는 즉시 이동 때문입니다.
PyAutoGUI는 이를 보완하기 위해 durationtween 옵션을 제공합니다.
duration은 이동 시간을 지정하여 애니메이션처럼 자연스럽게 만들고, tween은 움직임의 가속과 감속 패턴을 정해 사람 손처럼 보이게 해줍니다.

📐 duration 매개변수

duration은 이동에 걸리는 시간을 초 단위로 설정합니다.
값이 클수록 이동이 느려지고 안정적이며, 값이 작을수록 빠르지만 대상 프로그램이 드래그 이벤트를 놓칠 위험이 있습니다.

CODE BLOCK
# 1초 동안 천천히 이동
pag.dragTo(800, 400, duration=1.0, button='left')

⚡ tween 함수

tween은 마우스가 이동하는 속도의 분배를 결정합니다.
PyAutoGUI는 다양한 이징 함수(easing function)를 내장하고 있으며, 사람 손의 움직임과 비슷하게 만들 수 있습니다.

tween 함수 특징
linear 속도가 일정합니다.
기계적이고 자연스럽지 않습니다.
easeInOutQuad 처음과 끝은 느리고 중간은 빠릅니다.
가장 자연스럽게 보입니다.
easeInOutSine 부드러운 가속과 감속을 제공합니다.
곡선 형태의 움직임과 비슷합니다.
easeInBounce 도착 지점에서 튕기는 듯한 효과를 줍니다.
테스트나 시각적 효과에 적합합니다.

🧪 예제 코드

CODE BLOCK
import pyautogui as pag

# 자연스러운 드래그: 0.8초 동안 easeInOutQuad 적용
pag.dragTo(1000, 500, duration=0.8, button='left', tween=pag.easeInOutQuad)

# 부드러운 사인 곡선 느낌
pag.dragRel(300, 0, duration=1.0, button='left', tween=pag.easeInOutSine)

위 코드를 실행하면 드래그가 단순한 기계적 이동이 아니라, 실제 사람 손이 끄는 듯한 움직임으로 보입니다.
이런 미세한 차이가 GUI 자동화의 신뢰도를 크게 높여줍니다.

💡 TIP: tween은 pyautogui의 내장 함수를 그대로 사용할 수도 있고, 직접 커스텀 함수를 정의해 적용할 수도 있습니다.
예를 들어 로그 곡선이나 지그재그 움직임 같은 독창적인 패턴을 구현할 수 있습니다.

  • duration은 너무 짧으면 실패할 수 있으니 0.3초 이상 권장합니다.
  • tween은 easeInOut 계열이 가장 자연스럽습니다.
  • 🎨tween을 조합하면 다양한 사용자 경험을 모방할 수 있습니다.
  • 🛡️duration과 tween 설정은 자동화 대상 프로그램의 반응 속도에 맞추세요.

⚠️ 주의: duration을 과도하게 길게 설정하면 자동화 전체가 느려져 작업 시간이 크게 늘어날 수 있습니다.
적절한 균형을 유지하세요.



🧪 실전 예제와 안전 설정

PyAutoGUI의 dragTo와 dragRel은 단순한 개념 이해만으로는 충분하지 않습니다.
실제로 응용 프로그램에서 적용할 때는 안전성과 재현성을 확보하기 위한 설정이 필요합니다.
특히 드래그 과정 중 갑작스러운 오류나 무한 루프를 방지하기 위해 사전 대비가 중요합니다.

🛟 안전 설정

PyAutoGUI는 기본적으로 FAILSAFE 기능을 제공합니다.
마우스를 화면 왼쪽 상단(0,0) 근처로 빠르게 이동시키면 자동으로 예외를 발생시켜 스크립트를 중지할 수 있습니다.
또한 PAUSE 옵션을 설정하면 각 명령어 사이에 짧은 지연을 주어 안정성을 높일 수 있습니다.

CODE BLOCK
import pyautogui as pag

# 안전 장치 활성화
pag.FAILSAFE = True
pag.PAUSE = 0.1  # 각 동작 사이 0.1초 지연

🧑‍💻 실전 예제

다음은 드래그를 활용하여 이미지 편집 프로그램에서 객체를 옮기는 시나리오 예제입니다.

CODE BLOCK
# 시작 좌표로 이동해 클릭
pag.moveTo(400, 300)
pag.mouseDown(button='left')

# 자연스러운 곡선 이동
pag.dragTo(800, 600, duration=0.8, tween=pag.easeInOutQuad)

# 버튼 해제
pag.mouseUp(button='left')

이 패턴은 드래그 시작과 종료를 명확히 제어할 수 있기 때문에 예외 상황에서도 안정적으로 동작합니다.
특히 mouseDownmouseUp을 직접 다루면 복잡한 드래그 동작도 섬세하게 구현 가능합니다.

📦 실전 팁

  • 🛑FAILSAFE는 반드시 켜두세요.
    비상 상황에서 스크립트를 즉시 중단할 수 있습니다.
  • ⏱️PAUSE를 적절히 주면 CPU 점유율을 줄이고 안정성이 높아집니다.
  • 📍이미지 매칭으로 시작 좌표를 찾으면 다양한 해상도에서도 재현성이 높습니다.
  • 🧭dragTo와 dragRel을 적절히 섞어 쓰면 절대/상대 좌표 활용이 더 자유로워집니다.

⚠️ 주의: 무한 루프 안에서 dragRel을 사용할 때는 반드시 반복 횟수를 제한하거나 종료 조건을 설정해야 합니다.
그렇지 않으면 마우스가 예상치 못한 위치로 계속 이동할 수 있습니다.

💡 TIP: drag 동작을 디버깅할 때는 로그를 남기거나 스크린샷을 주기적으로 찍어두면 예기치 못한 이동을 쉽게 추적할 수 있습니다.

자주 묻는 질문 (FAQ)

dragTo와 dragRel의 가장 큰 차이는 무엇인가요?
dragTo는 절대 좌표 기준으로 이동하고, dragRel은 현재 위치에서 상대적인 거리를 이동합니다.
duration을 지정하지 않으면 어떻게 되나요?
duration을 생략하면 이동이 매우 빠르게 실행되어 앱이 드래그 동작을 놓칠 수 있습니다.
tween 옵션은 꼭 설정해야 하나요?
필수는 아니지만 기본 linear보다 easeInOut 계열을 사용하면 훨씬 자연스러운 드래그가 가능합니다.
button을 ‘right’로 설정하면 항상 동작하나요?
일부 프로그램에서는 오른쪽 버튼 드래그가 메뉴 호출로 처리될 수 있어 동작이 달라질 수 있습니다.
drag 실행 중 멈추게 하려면 어떻게 하나요?
PyAutoGUI의 FAILSAFE 기능을 켜두면 마우스를 (0,0) 위치로 이동시켜 즉시 종료할 수 있습니다.
dragRel을 반복하면 누적 이동이 발생하나요?
네, dragRel은 현재 위치를 기준으로 이동하기 때문에 루프 안에서는 이동이 계속 누적됩니다.
dragTo와 mouseDown, mouseUp을 함께 써야 할 때는 언제인가요?
일부 앱은 드래그 시작 시 클릭을 유지해야 동작하므로 mouseDown → dragTo → mouseUp 패턴이 필요합니다.
화면 해상도가 바뀌면 dragTo 좌표도 바꿔야 하나요?
네, 절대 좌표는 해상도 영향을 받습니다. locateOnScreen을 활용하면 이미지 기반으로 좌표를 자동 탐색할 수 있습니다.

📝 PyAutoGUI 드래그 옵션 활용 정리

PyAutoGUI의 dragTodragRel은 마우스를 자동으로 끌어주는 핵심 함수로, 절대 좌표와 상대 좌표라는 차이를 갖습니다.
여기에 button 매개변수로 마우스 버튼 종류를 지정하고, durationtween으로 속도와 움직임 패턴을 제어하면 실제 사람이 조작하는 듯한 자연스러운 드래그를 구현할 수 있습니다.
또한 FAILSAFE, PAUSE 같은 안전 장치와 이미지 매칭 기반 좌표 탐색을 병행하면 해상도나 환경 변화에도 강인한 자동화 코드를 만들 수 있습니다.
GUI 자동화의 완성도는 단순히 동작 여부가 아니라 얼마나 매끄럽게 보이는가에 달려 있습니다.
이번 정리를 통해 PyAutoGUI의 드래그 기능을 제대로 이해하고 활용하면, 반복적인 작업을 자동화하면서도 사용자 경험과 안정성을 동시에 챙길 수 있습니다.


🏷️ 관련 태그 : PyAutoGUI, 파이썬자동화, 마우스드래그, dragTo, dragRel, tween, duration, GUI자동화, 파이썬스크립트, 프로그래밍팁