【问题标题】:How do i create a keyboard listener with events? (Python)如何创建带有事件的键盘侦听器? (Python)
【发布时间】:2021-08-19 21:27:30
【问题描述】:

首先,我是 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())

【问题讨论】:

    标签: python events event-handling keyboard-events


    【解决方案1】:

    您似乎把本可以轻松完成的任务过于复杂化了。现在,如果没有我放在最后的那个 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2014-01-20
      • 2017-01-06
      • 2012-12-05
      相关资源
      最近更新 更多