Как выйти из программы или цикла Python через keybind или макрос?Прерывание клавиатуры не работает - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь завершить простую программу автоматизации с графическим интерфейсом, которая просто открывает веб-страницу и затем нажимает на определенное место на странице каждые 0,2 секунды, пока я не скажу ей остановиться.Я хочу, чтобы мой код выполнялся и его цикл выполнялся бесконечно, пока указанная привязка клавиш не разорвет цикл (или всю программу).Я начал с классического KeyboardInterrupt, который позволяет CTRL + C выходить из программы.Вот что я думал, что мой окончательный код будет выглядеть так:

import webbrowser, pyautogui, time
webbrowser.open('https://example.com/')
print('Press Ctrl-C to quit.')
time.sleep(5)
#pyautogui.moveTo(1061, 881)
try:
    while True:
            time.sleep(0.2)
            pyautogui.click(1061,881)
except KeyboardInterrupt:
    print('\nDone.')

Все в коде работает, за исключением того, что я не могу выйти из него после запуска цикла щелчка.Прерывание клавиатуры и использование CTRL-C для выхода не работают вообще для этого сценария, по любой причине.

Я просто хочу иметь возможность нажать «escape» (или любую другую клавишу), чтобы выйти из цикла (или программы в целом) - просто любым способом заставить цикл выйти и остановиться.Прямо сейчас он работает до бесконечности, но я хочу, чтобы простой макрос связывания клавиш мог его остановить / сломать.

Я пытался использовать getch для связывания клавиши escape, чтобы вызвать разрыв, но безрезультатно:

import webbrowser, pyautogui, time, msvcrt
webbrowser.open('https://example.com')
print('Press Ctrl-C to quit.')
time.sleep(5)
#pyautogui.moveTo(1061, 881)
try:
    while True:
            time.sleep(0.2)
            pyautogui.click(1061,881)
            if msvcrt.kbhit():
                key = ord(readch())
                if key == 27:
                    break

Я удивлен, что это было так сложно сделать в Python.Я обнаружил много похожих проблем в Stackoverflow, но с неудовлетворительными ответами, и, к сожалению, ни с одной из них, которые не решили мою проблему.Я смог с легкостью делать такие вещи на более простых языках программирования, таких как AuotHotKeys.Я чувствую, что я танцую вокруг решения.Любая помощь будет чудесно оценена!Заранее спасибо.

1 Ответ

0 голосов
/ 11 октября 2018

Если я правильно понял, вы хотите иметь возможность остановить вашу программу, нажав клавишу на клавиатуре.

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

Небольшой пример:

import threading, time
from msvcrt import getch

key = "lol"

def thread1():
    global key
    lock = threading.Lock()
    while True:
        with lock:
            key = getch()

threading.Thread(target = thread1).start() # start the background task

while True:
    time.sleep(1)
    if key == "the key choosen":
        # break the loop or quit your program

Надеюсь на его помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...