Python скрипт кликающий по экрану

Рейтинг: 0Ответов: 1Опубликовано: 06.06.2023

Переношу проект с одной версии программы на другую, т.к. импорт невозможен, использую копипаст объектов. Есть рутинная задача по копированию названий объектов, в корне проекта их нет, поэтому копировать название возможно только тыкая по экрану в чём python мне и помог.

import time
import pyautogui

#import pyautogui - координаты мышки
#pyautogui.displayMousePosition()

#задержка перед началом работы скрипта
time.sleep(10)

#находимся на первом проекте

#определяем количество повторений
repetitions = 12

for i in range(repetitions):
    # нажимаем F2, чтобы выделить название объекта
    pyautogui.moveTo(148, 623) # координаты первого объекта
    pyautogui.click()
    pyautogui.press('down', presses=i)
    pyautogui.press('f2')
    #копируем название в буфер обмена
    pyautogui.hotkey('ctrl', 'c')
   
    #переключаемся на второй проект
    pyautogui.hotkey('alt', 'tab')

    # вводим новое название объекта в поле поиска
    pyautogui.moveTo(142, 325)
    pyautogui.click()
    pyautogui.press('down', presses=i)
    pyautogui.press('f2')
    pyautogui.hotkey('ctrl', 'v')
    pyautogui.press('enter')

    # переключаемся на первый проект
    pyautogui.hotkey('alt', 'tab')


#скрипт выполнен!

Помогите сделать выход из программы какой либо кнопкой. Пробовал esc вот так и через другую библиотеку, но не срабатывает.

#проверяем, не нажата ли клавиша "esc" для отмены выполнения скрипта if win32api.GetAsyncKeyState(0x1B): # 0x1B - код клавиши "esc" break

И может кто подскажет, поскольку координата указывается только первая как сделать так чтобы скрипт запускался после нажатия мышкой на первый объект, как бы получая их после нажатия. И возможно ли учесть прокуртку? Т.к. когда список требует прокрутки всё ломается, копирует начинает мимо вставлять скопированное и вообще непредсказуемо вести себя

Ответы

▲ 1Принят

Завершать программу можно через signal, нужно будет переключится на терминал и нажать Ctrl + C, программа завершится.

import signal
# добавление хандлера, при нажатии CTRL + C, программа завершится
signal.signal(signal.SIGINT, lambda signum, frame: exit(1))

Чтобы из программы можно было выйти даже когда она работает на фоне - нужно использовать 2 потока один будет выполнять главную задачу, другой отлавливать нажатие ESC (с помощью keyboard) и завершать работу.

Код с использованием потоков:

import keyboard
import threading
import time
import pyautogui

def exit_on_esc():
    while True:
        if keyboard.is_pressed('esc'):
            exit(1)

def main():
    #задержка перед началом работы скрипта
    time.sleep(10)

    #находимся на первом проекте

    #определяем количество повторений
    repetitions = 12

    for i in range(repetitions):
        # нажимаем F2, чтобы выделить название объекта
        pyautogui.moveTo(148, 623) # координаты первого объекта
        pyautogui.click()
        pyautogui.press('down', presses=i)
        pyautogui.press('f2')
        #копируем название в буфер обмена
        pyautogui.hotkey('ctrl', 'c')
    
        #переключаемся на второй проект
        pyautogui.hotkey('alt', 'tab')

        # вводим новое название объекта в поле поиска
        pyautogui.moveTo(142, 325)
        pyautogui.click()
        pyautogui.press('down', presses=i)
        pyautogui.press('f2')
        pyautogui.hotkey('ctrl', 'v')
        pyautogui.press('enter')

        # переключаемся на первый проект
        pyautogui.hotkey('alt', 'tab')


if __name__ == "__main__":
    # Запуск потока с отлавливанием нажатия ESC
    exit_thread = threading.Thread(target=exit_on_esc)
    exit_thread.start()

    # Запуск основного потока
    main_thread = threading.Thread(target=main)
    main_thread.start()

#скрипт выполнен!

Чтобы стартовать программу когда вы навелись мышкой на определенную область, можно бесконечно получать координаты и если они в радиусе 20 пикселей от заданной точки, то продолжать выполнение кода.

Пример:

import pyautogui

# mouse position
x, y = pyautogui.position()

START_COORDINATE = (148, 623)

D = 20

while True:
    # mouse position
    x, y = pyautogui.position()
    print(x, y)
    # if x +- D == START_COORDINATE[0] and y +- D == START_COORDINATE[1]:
    if (x >= START_COORDINATE[0] - D and 
        x <= START_COORDINATE[0] + D and 
        y >= START_COORDINATE[1] - D and 
        y <= START_COORDINATE[1] + D):

        input(123)
        break

Готовый код с выходом через ESC и стартом главной функции после наведения на заданные координаты (+- 20 пикселей):

import keyboard
import threading
import pyautogui

def exit_on_esc():
    while True:
        if keyboard.is_pressed('esc'):
            exit(1)

def main():
    #когда координаты мыши близки к заданным, продолжать выполнение
    START_COORDINATE = (148, 623)
    D = 20

    while True:
        # получение позиции мыши
        x, y = pyautogui.position()
        print(x, y)
        # if x +- D == START_COORDINATE[0] and y +- D == START_COORDINATE[1]:
        if (x >= START_COORDINATE[0] - D and 
            x <= START_COORDINATE[0] + D and 
            y >= START_COORDINATE[1] - D and 
            y <= START_COORDINATE[1] + D):

            break


    #находимся на первом проекте

    #определяем количество повторений
    repetitions = 12

    for i in range(repetitions):
        # нажимаем F2, чтобы выделить название объекта
        pyautogui.moveTo(148, 623) # координаты первого объекта
        pyautogui.click()
        pyautogui.press('down', presses=i)
        pyautogui.press('f2')
        #копируем название в буфер обмена
        pyautogui.hotkey('ctrl', 'c')

        #переключаемся на второй проект
        pyautogui.hotkey('alt', 'tab')

        # вводим новое название объекта в поле поиска
        pyautogui.moveTo(142, 325)
        pyautogui.click()
        pyautogui.press('down', presses=i)
        pyautogui.press('f2')
        pyautogui.hotkey('ctrl', 'v')
        pyautogui.press('enter')

        # переключаемся на первый проект
        pyautogui.hotkey('alt', 'tab')


if __name__ == "__main__":
    # Запуск потока с отлавливанием нажатия ESC
    exit_thread = threading.Thread(target=exit_on_esc)
    exit_thread.start()

    # Запуск основного потока
    main_thread = threading.Thread(target=main)
    main_thread.start()

#скрипт выполнен!