Завершать программу можно через 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()
#скрипт выполнен!