본문 바로가기

Code Snippets/파이썬

[파이썬-Pyautogui] 사용자가 직접 마우스 위치 설정하기

 

Pyautogui를 이용하여 마우스 클릭 매크로를 만들다 보면 한가지 어려운 점이 발생한다.

 

이 매크로를 사용하는 사용자마다 컴퓨터 모니터나 해상도가 달라서, 어떤 버튼이 위치한 x좌표와 y좌표를 고정시키기가 어렵다.

 

그래서 그 버튼의 위치를 opencv를 연동한 screenshot 기능으로도 찾을 수 있지만, 실제로 사용해보니 정확도가 많이 낮다.

 

그보다는 사용자가 직접 매크로를 사용하기 전, 특정 버튼의 위치를 저장할 수 있도록 하는 함수를 만들어 보는게 좋을 것 같다는 생각에서 아래와 같이 만들어 보았다.

 

import pyautogui
import time

def save_locations():
    message = "마우스 초기 설정을 시작합니다. 우측 상단의 카메라에 마우스를 위치합니다 (5초 후 저장)"
    print(message)
    time.sleep(5)
    p1 = pyautogui.position()

    message = "위치가 저장되었습니다. 카메라를 클릭 후, ""앨범에서 사진 또는 영상 선택"" 버튼으로 이동합니다. (5초 후 저장)"
    print(message)
    time.sleep(5)
    p2 = pyautogui.position()

    message = "위치가 저장되었습니다. 마우스 클릭 후, 앨범의 가장 좌측 상단 사진 중앙 하단에 위치합니다 (클릭하면 선택이 되는 위치가 아니라, 클릭하면 미리보기로 넘어가는 위치입니다. 5초 후 저장)"
    print(message)
    time.sleep(5)
    p3 = pyautogui.position()

    message = "위치가 저장되었습니다. 미리보기 클릭 후, 우측 하단의 선택으로 이동합니다. (5초 후 저장)"
    print(message)
    time.sleep(5)
    p4 = pyautogui.position()

    message = "위치가 저장되었습니다. 선택 후 우측 상단의 완료로 이동합니다. (5초 후 저장)"
    print(message)
    time.sleep(5)
    p5 = pyautogui.position()

    message = "위치가 저장되었습니다. 완료 클릭 후 우측 상단의 게시로 이동합니다. (5초 후 저장)"
    print(message)
    time.sleep(5)
    p6 = pyautogui.position()

    message = "위치가 모두 locations.txt 파일에 저장되었습니다"
    print(message)

    time.sleep(2)

    locations = [p1,p2,p3,p4,p5,p6]

    # write each item as new line in txt
    with open('locations.txt', 'w') as f:
        for item in locations:
            f.write(str(item[0]) + " " + str(item[1])+"\n")

 

 

코멘트

 

1. 위 코드로 인해서 사용자가 스스로 버튼의 위치를 txt 파일에 저장할 수 있다.

2. 실제 프로그램에서는 txt 파일의 x좌표, y좌표를 아래와 같은 helper function으로 불러오면 된다.

def get_locations():
    myfile = r"absolute_path_of_txt"

    saved_locations = []
    with open(myfile, encoding='utf-8') as f:
        for line in f:
            tmp = line.rstrip().split(" ")
            tmp = [int(i) for i in tmp]
            saved_locations.append(tmp)
    # change all to int

    return saved_locations