简体   繁体   English

pynput on_press 由自己的 keyboard.press 触发

[英]pynput on_press triggerd by own keyboard.press

Like described in the titel, the function on_press of the pynput listener gets triggerd by it's own keypress.如标题中所述,pynput 侦听器的 function on_press由其自己的按键触发。

I tried doing several things, like adding a boolean that makes it so that when the code itselfs run the keypress or keyrelease, it doesn't print or press the key, and even added a massive delay, but none of this works.我尝试做几件事,比如添加一个 boolean,这样当代码本身运行 keypress 或 keyrelease 时,它不会打印或按下按键,甚至会增加大量延迟,但这些都不起作用。

The code:代码:

from pynput import keyboard
from pynput.keyboard import Key, Controller
import time

k = Controller()

randomVar = True

def on_press(key):
    global randomVar
    if randomVar:
        print(key)
        randomVar = False
        k.press(key)
        time.sleep(0.45)
        randomVar = True

def on_release(key):
    global randomVar
    if randomVar:
        print(key)
        randomVar = False
        k.release(key)
        time.sleep(0.45)
        randomVar = True


# Collect events until released
with keyboard.Listener(suppress=True, on_press=on_press, on_release=on_release) as listener:
    try:
        listener.join()
    except Exception as e:
        print('{0} was pressed'.format(e.args[0]))

Expected output when I push d当我按d时预期为 output

'd'
'd'

Actual output:实际 output:

'd'
'd'
'd'
'd'
'd'
'd'
...

EDIT: I also tried just putting everything in on_press, but this gives the same result:编辑:我也尝试将所有内容都放在 on_press 中,但这给出了相同的结果:

def on_press(key):
    global randomVar
    if randomVar:
        print(key)
        randomVar = False
        k.press(key)
        k.release(key)
        time.sleep(0.45)
        randomVar = True

def on_release(key):
    pass

My solution is a terrible way of doing this, but currently after struggling for hours, the only thing I could come up with.我的解决方案是一种糟糕的方法,但目前经过数小时的努力,这是我唯一能想到的。 It stops the listener and then pressed the key, and then starts the listener again, making it a loop of stopping and starting the listener, which is very suboptimal它停止监听器然后按下键,然后再次启动监听器,使其成为一个停止和启动监听器的循环,这是非常次优的

I would love to hear from people how this could've been differently, but for now, this is my only solution:我很想听听人们怎么说这会有什么不同,但就目前而言,这是我唯一的解决方案:

from pynput import keyboard
from pynput.keyboard import Controller

k = Controller()

def on_press(key):
    global listener

    print(str(key))
    listener.stop()

def on_release(key):
    pass

while True:
    listener = keyboard.Listener(suppress=True, on_press=on_press, on_release=on_release)
    listener.start()
    listener.join()
    k.press("l")
    k.release("l")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM