如何用Esc键停止Python中的"playsound
我正在写一个程序,用来发出警报声。这个程序可以正常工作,不过我希望用户能通过按下“esc”键来停止声音。我不太确定该用什么样的循环,或者是否需要用数字27来表示“esc”键。
我该怎么写一个简单的过程来实现这个功能?这个过程应该放在代码的哪个位置呢?
from playsound import playsound
import time
CLEAR = "\033[2J"
CLEAR_AND_RETURN = "\033[H"
def alarm(seconds):
time_elapsed = 0
print(CLEAR)
while time_elapsed < seconds:
time.sleep(1)
time_elapsed += 1
time_left = seconds - time_elapsed
minutes_left = time_left // 60
seconds_left = time_left % 60
print(f"{CLEAR_AND_RETURN}Alarm will sound in: {minutes_left:02d}:{seconds_left:02d}")
playsound("alarm.mp3")
minutes = int(input("How many minutes to wait until alarm sounds?:"))
seconds = int(input("How many seconds to wait until alarm sounds?:"))
total_seconds = minutes * 60 + seconds
alarm(total_seconds)
alarm(2)
1 个回答
0
Playsound
这个库并不是最好的选择,因为它没有停止播放声音的功能。一旦开始播放,唯一能停止的方法就是等声音文件播放完(根据文档的说明)。
解决这个问题的一种方法是使用multiprocessing
,这样你就可以在任何时候停止播放,而不需要退出程序。我会使用keyboard
这个模块来检测按键:
from playsound import playsound
import multiprocessing
import keyboard
CLEAR = "\033[2J"
CLEAR_AND_RETURN = "\033[H"
def start(): #once alarm() is finished, now we start playing the sound
p = multiprocessing.Process(target=play)
p.start()
keyboard.add_hotkey(lambda: end(p), 'esc') #whenever we press esc, it calls the function end() with the argument p (which is our process)
def end(p):
p.terminate() #makes the sound stop playing
def play():
playsound("alarm.mp3")
def alarm(seconds):
time_elapsed = 0
print(CLEAR)
while time_elapsed < seconds:
time.sleep(1)
time_elapsed += 1
time_left = seconds - time_elapsed
minutes_left = time_left // 60
seconds_left = time_left % 60
print(f"{CLEAR_AND_RETURN}Alarm will sound in: {minutes_left:02d}:
{seconds_left:02d}")
start()
minutes = int(input("How many minutes to wait until alarm sounds?:"))
seconds = int(input("How many seconds to wait until alarm sounds?:"))
total_seconds = minutes * 60 + seconds
alarm(total_seconds)
不过...我之前提到过playsound
并不是最好的模块。使用pyaudio
会更好。你可以看看这个StackOverflow的帖子(我从那里得到了multiprocessing
的代码),了解如何使用pyaudio
。Pyaudio
允许你播放和停止音频,而不需要用到multiprocessing
。