@RchCG

Как остановить скрипт python используя сочетание клавиш из любого окна?

Приветствую!
Написал скрипт который из любой точки экрана выбирает иконку телеграмма(она закреплена в определённой позиции тулбара) и бесконечно пишет и отправляет какое-либо сообщение.
Проблема заключается в том что я хочу иметь возможность остановить этот скрипт не используя базовые сочетания клавиш по остановке программы(ctrl+c или же ctrl+f2 в pycharm), я попробовал решить эту проблему с помощью модуля keyboard но это тяжело назвать решением потому что оно или не работает вовсе или работает так что приходится спамить сочетание клавиш(подозреваю из-за того что засунул проверку в цикл), как можно решить эту проблему?
сам код:
import keyboard
import sys

import pyautogui


telegram_pos = (455, 1063)
telegram_message_box = (440, 1023)
pyautogui.click(*telegram_pos)

while True:
    if keyboard.is_pressed('ctrl+shift+k'):
        sys.exit('Stopping the script....')
    pyautogui.click(*telegram_message_box)
    pyautogui.typewrite('any information....\n', interval=0.07)
  • Вопрос задан
  • 851 просмотр
Решения вопроса 1
botermain
@botermain
Многопоточность - залог успеха, советую почитать эту статью, уверен, что ни раз пригодится

Тем не менее, решение твоей проблемы довольно простое, с помощью модуля multiprocessing в отдельном процессе запускаешь функцию, которая будет слушать нажатия клавиш и завершать процесс по его PID:

import os
import signal
import keyboard
import multiprocessing


def hook(pid):
    while True:
        if keyboard.is_pressed('ctrl + 1'):
            os.kill(pid,signal.SIGTERM)
            os._exit(1)


if __name__ == '__main__':
    pid = os.getpid()
    multiprocessing.Process(target=hook,args=[pid]).start()
    #-----------------------------------------------------#
    #Здесь располагай свой код
    # -----------------------------------------------------#

Конечно, можно также использовать модуль threading, но я более чем уверен , что будут проблемы с GIL, поэтому multiprocessing - это лучший вариант
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
YaPA24
@YaPA24
IT эксперт
Все таки проще закрывать свою программу чем процессы по номеру.
пример рабочего кода:
import threading, time
import keyboard as kb
import tkinter as tk

# Функция для выхода из программы по нажатию клавиши "Esc"
def wait_exit():
    kb.wait('alt+s')
    time.sleep(1)
    root.destroy()

def main():
    while stop:
        # основнаяпрограмма ...
        time.sleep(60)

root = tk.Tk()
# рисуем красивые кнопки и метки...

threading.Thread(target=wait_exit, daemon=True).start()
threading.Thread(target=main, daemon=True).start()

root.mainloop()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы