首页 > 解决方案 > 如何循环直到使用pynput按下某个按钮?

问题描述

我当前的代码:

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'对象没有属性'Listener'”的错误。当我不包含侦听器部分时,我的代码可以工作,所以我不确定如何将它们组合在一起以制作一个有凝聚力的程序。

标签: python-3.xpynput

解决方案


问题是你写了from pynput import keyboard,然后keyboard = Controller(),,所以同一个变量keyboard然后引用你的 Controller 实例,而不是模块 pynput.keyboard (这实际上是其中的 Listener 类)

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

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

推荐阅读