Обнаружить нажатие клавиши в Python не работает - PullRequest
0 голосов
/ 02 июля 2018
import pyautogui, time, threading, keyboard, msvcrt

global active, exitp
active = False
exitp = False

Names = []

def mainLoop():
    global active, exitp
    pressedkey = msvcrt.getch()
    while True:
         if pressedkey == 'z':
            active = not active
         elif pressedkey == 'x':
            exitp = False
            break

def running():
    global exitp
    while not exitp:
        print("Running")
        time.sleep(3)

start = time.time()
print("Your screen size is: " + str(pyautogui.size()))
width, height = pyautogui.size()
t1 = threading.Thread(target=mainLoop, args=())
t2 = threading.Thread(target=running, args=())
t1.start()
t2.start()
while not exitp:
    if active:
        pyautogui.click(90, height - 110)
        for i in range(len(Names)):
            if active:
                pyautogui.typewrite(Names)
                pyautogui.press("enter")
            else:
                break
        active = False
end = time.time()
print("Execution time: " + str(end-start) + " seconds")

пытается создать цикл, который завершается, когда я нажимаю 'x', и набирает / прекращает вводить имена из моего массива, называемые "Имена", когда нажимаю "z", однако я нажимаю и "x", и "z" но они ничего не помогают?

1 Ответ

0 голосов
/ 02 июля 2018
from pynput import keyboard

import pyautogui
import threading
import sys

class Status:
    _exit = False
    active = True

names = [str(i) for i in range(0, 10, 1)]

width, height = pyautogui.size()

def mainThread():
    listenerThread = keyboard.Listener(on_press = onKeyPress)
    listenerThread.start()

    while(not Status._exit):
        if (not Status.active):
            continue

        pyautogui.click(90, height - 110)

        for i in range(len(names)):
            if (not Status.active or Status._exit):
                break

            pyautogui.typewrite(names[i])
            pyautogui.press("enter")


    keyboard.Listener.stop(listenerThread)
    print("Stopped listerning")
    sys.exit(0)


def onKeyPress(key):
    print("Still listerning")

    try:
        k = key.char
    except Exception:
        k = key.name

    if (k == "z"):
        Status.active = not Status.active

    elif (k == "x"):
        Status._exit = not Status._exit


#controlThread = threading.Thread(target = mainThread)
#controlThread.start()

mainThread()

Вместо использования глобальных переменных я использовал «статический» класс, который сохранял статус. Я также использовал другой модуль для прослушивания клавишных вводов.

Я думаю, это то, что вы хотели.

РЕДАКТИРОВАТЬ: Вы не должны иметь основной цикл в качестве потока. Если вы хотите сделать что-то другое, установите его как поток (раскомментируйте две строки и закомментируйте последнюю строку) или просто оставьте все как есть.

...