본문 바로가기
python

[파이썬] python pyautogui, 두 지점을 키보드로 저장하여 자동으로 클릭하기

디지털노마드 2023. 1. 31.
반응형

 

특정한 위치에 마우스를 가져다 놓고, ctrl + 1 을 눌러서 position 1 을 저장하고

다시 두번째 위치에 마우스를 가져다 놓고 ctrl + 2 를 눌러서 position 2를 저장한다. 

그리고 저장이 끝나면

[5초 sleep > 현재 위치 저장 > position1 클릭 > position2 클릭 > 현재 위치로 돌아옴]

을 반복하는 프로그램이다. 

 

import threading
import keyboard
import pyautogui

global scr_width
global scr_height
global position1_cur_x
global position1_cur_y
global position2_cur_x
global position2_cur_y

# 마우스가 화면 끝까지 가도 프로그램이 종료되지 않는다
pyautogui.FAILSAFE = False


def positioni_scr_out() -> bool:

    global scr_width
    global scr_height

    cur_x, cur_y = pyautogui.position()

    if cur_x < 0 or cur_x > scr_width or cur_y < 0 or cur_y > scr_height:

        print("program stopped: ", end = " ")
        print("cur_x is " + str(cur_x), end = " ")
        print("cur_y is " + str(cur_y))
        return True

    return False


def get_keyboard():

    global position1_cur_x
    global position1_cur_y
    global position2_cur_x
    global position2_cur_y

    flag1 = 0
    flag2 = 0

    while True:

        if keyboard.is_pressed("ctrl+1") and flag1 == 0:

            flag1 = 1
            position1_cur_x, position1_cur_y = pyautogui.position()
            print("target saved" + " position1_cur_x is " + str(position1_cur_x) + " position1_cur_y is " + str(position1_cur_y))

        if keyboard.is_pressed("ctrl+2") and flag2 == 0:
            flag2 = 1
            position2_cur_x, position2_cur_y = pyautogui.position()
            print("target saved" + " position2_cur_x is " + str(position2_cur_x) + " position2_cur_y is " + str(position2_cur_y))

        if flag1 + flag2 == 2:
            break


def do_action():

    global scr_width
    global scr_height
    global position1_cur_x
    global position1_cur_y
    global position2_cur_x
    global position2_cur_y

    while True:

        pyautogui.sleep(5)

        if positioni_scr_out():
            break

        return_cur_x,return_cur_y = pyautogui.position()
        pyautogui.click(position1_cur_x, position1_cur_y)
        pyautogui.sleep((0.01))

        if positioni_scr_out():
            break

        pyautogui.click(position2_cur_x, position2_cur_y)

        if positioni_scr_out():
            break

        pyautogui.moveTo(return_cur_x, return_cur_y)


def main():

    global scr_width
    global scr_height
    global position1_cur_x
    global position1_cur_y
    global position2_cur_x
    global position2_cur_y

    scr_width, scr_height = pyautogui.size()
    act_thread = threading.Thread(target = do_action)
    key_thread = threading.Thread(target = get_keyboard)
    key_thread.start()
    act_thread.start()


if __name__ == "__main__":
    main()

 

두개의 thread 를 돌린다. 

하나는 키보드 입력을 받는 key_thread 이고 

또 하나는 2개의 position 을 클릭하고 제자리로 돌아오는 act_thread 이다. 

 

실행해보니 한가지 버그가 있는데, 

시작하고 act_thread 가 5초간 기다리는데, 5초 이후에도 ctrl+1, ctrl+2 로 

포인트가 저장되지 않으면 에러가 발생한다. (나중에 수정해야 겠다.)

 

threading 으로 thread 패키지를 받아왔고, 

keyboard, pyautogui 로 구현했다. 

 

금방 할줄 알았는데, 생각보다 해야 할것이 좀 있었다. 

반응형

댓글