簡體   English   中英

如何暫停 pynput 事件偵聽器

[英]How to pause a pynput event listener

我正在嘗試制作一個程序來讀取用戶的輸入,如果它檢測到某個組合鍵,它將輸入一個特殊字符。 目前我正在測試,我希望腳本在用戶鍵入的每個字符后僅 output 一個“+”。 我正在使用 pynput 事件偵聽器來確定是否按下了某個鍵並使用“暫停”變量,以便“+”的 output 不會導致事件偵聽器進行無限循環。 問題是事件監聽器無論如何都會進入無限循環,我不知道為什么。

每次按鍵后當前鍵入的 output: +++++++++++++++++++...

每次按鍵后所需鍵入的 output: +

每次按鍵后的當前控制台 output:
暫停是假的
被壓
被釋放
['F']
暫停
發送輸出
未暫停
暫停是假的
被壓
被釋放
['+']
暫停
發送輸出
未暫停
暫停是假的
被壓
被釋放
['+']
暫停
發送輸出
未暫停
暫停是假的
被壓
被釋放
...

每次按鍵后所需的控制台 output:
暫停是假的
被壓
被釋放
['F']
暫停
發送輸出
暫停為真
未暫停

import pynput
import time
from pynput.keyboard import Key, Listener, Controller
keyboardOut = Controller()
PressedKeys = []
ReleasedKeys = []
Pause = False
def on_press(key):
    global PressedKeys, ReleasedKeys, Pause
    print("pause is "+str(Pause))
    if Pause == False:
        print("getting pressed")
        PressedKeys.append(key)
    else:
        return
    


def on_release(key):
    global PressedKeys, ReleasedKeys, Pause
    if Pause == False and len(PressedKeys) > 0:
        print("getting released")
        ReleasedKeys.append(key)
        test_frame()
    else:
        return

def test_frame():
    global Pause
    print(PressedKeys)
    Pause = True
    print("paused")
    print("send outputs")
    keyboardOut.press('+')
    keyboardOut.release('+')
    PressedKeys.clear()
    ReleasedKeys.clear()
    Pause = False
    print("unpaused")
    time.sleep(1)
    
# Collect events until released 
with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join() 

如何修復我的代碼以*實際上*暫停事件偵聽器。 我是 python 的新手,所以我可能只是不明白如何正確更新全局變量。

在使用鍵盤 controller 之前,您必須停止監聽器。 我希望這段代碼有所幫助,我試圖盡可能接近我認為你正在尋找的東西。

代碼:

from pynput import keyboard
from time import sleep

KeyboardOut = keyboard.Controller()
pressed_keys = []
released_keys = []

def on_press(key):
    try:
        pressed_keys.append(format(key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    if len(pressed_keys) > 0:
        released_keys.append(format(key))
        test_frame()
        return False
    if key == keyboard.Key.esc:
        # Stop listener
        return False

def test_frame():
    print('\n\n'+str(pressed_keys))
    print('paused')
    print('send outputs')
    KeyboardOut.press('+')
    KeyboardOut.release('+')
    pressed_keys.clear()
    released_keys.clear()
    with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
        listener.run()
    print('unpaused')
    sleep(1)
    return True

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM