首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >pynput键盘监听器自动重复

pynput键盘监听器自动重复
EN

Stack Overflow用户
提问于 2020-02-09 20:45:47
回答 1查看 343关注 0票数 1

我尝试使用pynput来获取实时键盘输入,但在autorepeat中调用了on_press函数。

示例代码:

代码语言:javascript
代码运行次数:0
运行
复制
#!/usr/bin/env python3

import sys

import numpy as np
import sounddevice as sd

from pynput import keyboard

frequency = []

def on_press(key):
    global frequency
    try:
        print(key.vk)
        if key.char == "q":
            frequency.append(440)
        elif key.char == "w":
            frequency.append(880)
    except AttributeError:
        pass

def on_release(key):
    global frequency
    if key == keyboard.Key.esc:
        # Stop listener
        print("Press Enter")
        return False
    elif key.char == "q":
        frequency.remove(440)
    elif key.char == "w":
        frequency.remove(880)

listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release,
    suppress = True)
listener.start()

start_idx = 0

def callback(outdata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    print(frames)
    global start_idx
    t = (start_idx + np.arange(frames)) / 48000
    t = t.reshape(-1, 1)
    outdata[:] = 0 * t
    if len(frequency) > 0:
        print("Playing")
    for freq in frequency:
        outdata[:] = outdata[:] + 0.2 * np.sin(2 * np.pi * freq * t)

    start_idx += frames

try:
    with sd.OutputStream(channels=1, callback=callback,
            samplerate=48000):
        input()
        listener.stop()
except Exception as e:
    print("Exception")
    listener.stop()
    exit()

如果运行代码并按住Q键,键盘自动重复功能将启动并破坏整个侦听器。有没有可以正确处理原始键盘输入的python输入模块?

第二件事是代码经常会使我的Xorg崩溃。我只需运行该脚本几次,Xorg就会宕机。我也不知道为什么。Linux 5.5.2-zen1-1-zen x86_64 GNU/LinuxX.Org 1.20.7.

第三件事是声音合成似乎有相当的滞后。回调函数的帧数似乎挂在400左右,在每秒48000个样本的速率下不到10毫秒,但实际的音频反馈感觉像是延迟了几百毫秒。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-09 21:31:51

pygame有一个很好的按键监听器,很容易构建一个显示输出的GUI窗口。它在Linux中也能很好地工作:

代码语言:javascript
代码运行次数:0
运行
复制
import pygame

def main_loop():
    #code
    loopExit = False
    while not loopExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                loopExit = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_q:
                    #code

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_q:
                    #code

https://www.pygame.org/docs/ref/key.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60136768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档