如果在程序运行时按 Enter 键,如何停止音乐?

Posted

技术标签:

【中文标题】如果在程序运行时按 Enter 键,如何停止音乐?【英文标题】:How to stop music if Enter key is pressed anytime the program is running? 【发布时间】:2017-07-15 01:52:39 【问题描述】:

我希望我的程序执行以下操作:

当这个程序运行时: 如果按下Enter 键,则停止当前音乐文件的播放。


这是我的代码:

# https://docs.python.org/2/library/winsound.html

from msvcrt import getch
import winsound

while True:
    key = ord(getch())
    if key == 13:
        winsound.PlaySound(None, winsound.SND_NOWAIT)

winsound.PlaySound("SystemAsterisk", winsound.SND_ALIAS)
winsound.PlaySound("SystemExclamation", winsound.SND_ALIAS)
winsound.PlaySound("SystemExit", winsound.SND_ALIAS)
winsound.PlaySound("SystemHand", winsound.SND_ALIAS)
winsound.PlaySound("SystemQuestion", winsound.SND_ALIAS)

winsound.MessageBeep()

winsound.PlaySound('C:/Users/Admin/My Documents/tone.wav', winsound.SND_FILENAME)

winsound.PlaySound("SystemAsterisk", winsound.SND_ALIAS)

在文档中(请参阅我的代码第一行中的链接),我不确定天气 winsound.SND_NOWAIT 是否可以这样使用:winsound.SND_NOWAIT(),或者就像我尝试在 @987654325 下的代码中使用它一样@ 语句,或者如果两个语句产生相同的效果。

据我了解,在我按下Enter 按钮之前,程序永远不会播放声音文件,因为getch() 部分要求在继续之前。

然而,即使那部分代码不关心什么时候我按下任何东西,程序不会卡在while循环中吗?

【问题讨论】:

【参考方案1】:

winsound.SND_NOWAIT 的链接文档指出:

注意:现代 Windows 平台不支持此标志。

除此之外,我认为您不了解 getch() 的工作原理。这是其文档的链接:

https://msdn.microsoft.com/en-us/library/078sfkak

这是另一个名为 kbhit() 的相关文件(msvcrt 也包含,我在下面使用):

https://msdn.microsoft.com/en-us/library/58w7c94c.aspx

当按下 Enter 键时,以下将停止循环(和程序,因为这是其中唯一的东西)。请注意,它不会中断任何已经播放的单个声音,因为winsound 没有提供这样做的方法,但它会阻止播放任何其他声音。

from msvcrt import getch, kbhit
import winsound

class StopPlaying(Exception): pass # custom exception

def check_keyboard():
    while kbhit():
        ch = getch()
        if ch in '\x00\xe0':  # arrow or function key prefix?
            ch = getch()  # second call returns the actual key code
        if ord(ch) == 13:  # <Enter> key?
            raise StopPlaying

def play_sound(name, flags=winsound.SND_ALIAS):
    winsound.PlaySound(name, flags)
    check_keyboard()

try:
    while True:
        play_sound("SystemAsterisk")
        play_sound("SystemExclamation")
        play_sound("SystemExit")
        play_sound("SystemHand")
        play_sound("SystemQuestion")

        winsound.MessageBeep()

        play_sound('C:/Users/Admin/My Documents/tone.wav', winsound.SND_FILENAME)

        play_sound("SystemAsterisk")

except StopPlaying:
    print('Enter key pressed')

【讨论】:

以上是关于如果在程序运行时按 Enter 键,如何停止音乐?的主要内容,如果未能解决你的问题,请参考以下文章

检测文本输入字段中的 Enter 键

QTableWidget中编辑单元格,如何实现按下Enter键实现对文件名是不是重复的判断?

处理 UWP 应用程序上的“Enter”键

Android:如何停止这种音乐?

停止输入/返回键提交表单[重复]

如何在 UITextView 中垂直对齐文本