python pyautogui работает вместе с pynput - PullRequest
0 голосов
/ 28 августа 2018

Сюжет следующий, я делаю несколько кликеров с пиаптогу, но ему не хватает контроля. По сути, я хочу иметь возможность запускать и останавливать различные сценарии, основанные на pyautogui. Моя идея состояла в том, чтобы объединить функцию Listener из pynput, но она не работает должным образом. Запускается, когда я нажимаю назначенную клавишу, но не могу ее остановить, почему? Вот небольшой код:

from pynput.keyboard import Key, Controller, Listener
import time
import pyautogui as pg
pg.FAILSAFE = True
kb = Controller()
time.sleep(1)
def on_press(key):
    if key == Key.space:
        pg.position(500, 500)
        x = 20
        while key is not Key.enter:
            pg.moveRel(x, 0, duration=0.2)
            time.sleep(1)



with Listener(on_press=on_press) as listener:
    listener.join()

Я также пробовал этот цикл:

while True:
    if key==Key.enter:
        pg.moveRel(x, 0, duration=0.2)
    else:
        return(False)
    time.sleep(1)

но ничего не работает.

UPD: Может быть, кто-то может предложить мне другой модуль с функциями управления, который может быть полезен для кликера?

1 Ответ

0 голосов
/ 28 августа 2018

Не удается остановить, потому что вы находитесь в бесконечном цикле, когда вы делаете это:

while key is not Key.enter:

из-за того, что on_press не может быть вызван снова, и поэтому переменная key никогда не изменится.

from pynput.keyboard import Key, Controller, Listener
import time
import pyautogui as pg


import threading

pg.FAILSAFE = True
kb = Controller()
time.sleep(1)

threadExitFlag = threading.Event()
threadVar = None


def mouse_move_thread(threadExitFlag):
    pg.position(500, 500)
    x = 20
    while not threadExitFlag.is_set():
        pg.moveRel(x, 0, duration=0.2)
        time.sleep(1)

def on_press(key):
    global threadExitFlag

    if key == Key.space:
        threadVar = threading.Thread(target=mouse_move_thread, args=[threadExitFlag]).start()
    if key == Key.enter:
        threadExitFlag.set()

    #Turns this macro back on
    elif key == Key.esc:
        if threadExitFlag.is_set():
            threadExitFlag.clear()


with Listener(on_press=on_press) as listener:
    listener.join()

Чтобы использовать это, вы нажимаете пробел, чтобы начать движение мыши, затем вы можете остановить его, нажав ввод. После этого вам нужно нажать клавишу esc , чтобы сбросить событие, которое останавливает его, что означает, что для выполнения этого макроса дважды подряд необходимо нажать:

space (start the macro)
enter (stop/kill the macro)
esc (reset flag, if you press space after this you can start the macro again)

Я проверил это, и он работает на 100%.

...