如何使用事件创建键盘侦听器?(Python)

2024-10-01 00:31:19 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我是Python的初学者。。。 我试图设置一个程序,每当按下键盘上的一个键时,它就会播放正弦波。我已经了解了如何在python中播放声音,现在我正在尝试让python监听按键和释放。我用键盘模块和pysinewave模块来实现这一点

我有两个独立的线程等待键盘回拨某个键被按下或释放,然后它播放或停止声音并清除事件。似乎pressSineWave()运行while循环,即使它尚未设置,但随后无法正确清除它。它播放声音的速度太快,以至于python崩溃。你们认为问题出在哪里

import time
import keyboard
import threading
from pysinewave import SineWave


A = SineWave(pitch = 9, decibels = -40)

pressKeyEvent = threading.Event()
releaseKeyEvent = threading.Event()

def playSineWave():
   pressKeyEvent.wait()
   while pressKeyEvent.is_set:  
        A.play()
        pressKeyEvent.clear()

def stopSineWave():    
    releaseKeyEvent.wait()
    while releaseKeyEvent.is_set:  
        A.stop()
        releaseKeyEvent.clear()


playThread = threading.Thread(target=playSineWave)
stopThread = threading.Thread(target=stopSineWave)

playThread.start()
stopThread.start()

keyboard.on_press(pressKeyEvent.set())
keyboard.on_release(releaseKeyEvent.set())

Tags: 模块importevent声音def键盘threadingset
1条回答
网友
1楼 · 发布于 2024-10-01 00:31:19

看起来你已经把一项简单的任务复杂化了。现在,如果没有我在最后放的sleep语句,这个程序就会过载,代码中包含的线程只会使Python过载更多。下面的代码应该可以执行所需的操作,如果您愿意,您可以更改密钥

from pysinewave import SineWave
import keyboard
import time

A = SineWave(pitch = 9, decibels = -40)

while True:
    if keyboard.is_pressed('q'):
            A.play()
    else:
        A.stop()
    time.sleep(0.1) # Prevent output overflow

相关问题 更多 >