【问题标题】:How to loop until a certain button is pressed using pynput?如何循环直到使用pynput按下某个按钮?
【发布时间】:2021-08-12 17:38:30
【问题描述】:

我当前的代码:

from pynput import keyboard
from pynput.keyboard import Key, Controller
import threading
import datetime, time
import os
import subprocess

keyboard = Controller()

def loading():
    os.system("open /System/Applications/TextEdit.app")
    time.sleep(1)
    while running:
        keyboard.press("a")
        
def on_press(key):
    global running  # inform function to assign (`=`) to external/global `running` instead of creating local `running`

    if key == keyboard.Key.left:
        running = True
        # create thread with function `loading`
        t = threading.Thread(target=loading)
        # start thread
        t.start()
        
    if key == keyboard.Key.down:
        # to stop loop in thread
        running = False

    if key == keyboard.Key.right:
        # stop listener
        return False

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

我试图循环键盘按下,但在按下右键或向下键时停止,但我收到“'Controller' object has no attribute 'Listener'”的错误。当我不包含侦听器部分时,我的代码可以工作,所以我不确定如何将它们组合在一起以制作一个有凝聚力的程序。

【问题讨论】:

    标签: python-3.x pynput


    【解决方案1】:

    问题是你写了from pynput import keyboard,然后是keyboard = Controller(),所以同一个变量keyboard然后引用你的控制器实例,而不是模块pynput.keyboard(实际上是里面的监听类)

    您可以为此使用不同的名称,同时实例化它,然后在其他任何地方使用它,例如在 loading() 中,然后代码将起作用。

    • 注意:使用像 while True: keyboard.press('a') 这样没有延迟的循环是一个绝对 危险的想法 - 我的电脑已经完全挂起,没有回应,因为这样的陈述 - 并且不得不强行关闭它才能继续做任何事情。最好在其中也包含time.sleep

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多