python - Sådan stopper du musik, hvis Enter-tasten trykkes, når programmet kører?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil have mit program gøre noget i tråd med:


mens dette program kører:

        hvis tasten Enter trykkes, skal du stoppe den aktuelle musikfil, der afspilles.






Her er min kode:


# 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)





I dokumentationen (se link i den første linje i min kode), er jeg sikker på at vejret winsound.SND\_NOWAIT kan bruges som dette: winsound.SND\_NOWAIT(), eller ligesom jeg forsøgte at bruge det i min kode under [[if erklæring, eller hvis begge udsagn har samme virkning.


Det er min forståelse, at programmet aldrig kommer til at spille lydfilerne, før jeg har trykket på Enter -knappen, da getch() delen kræver , før du fortsætter.


Men selvom den del af koden ikke er ligeglad når jeg trykker på noget, vil programmet ikke blive fast i while sløjfen?

Bedste reference


Den tilknyttede dokumentation for winsound.SND\_NOWAIT hedder at:



   Bemærk: Dette flag understøttes ikke på moderne Windows-platforme.



Udover det tror jeg ikke du forstår hvordan getch() virker. Her er et link til dokumentationen:


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


Og her er en anden for en beslægtet, der hedder kbhit() (hvilken msvcrt indeholder og bruger jeg nedenfor):


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


Følgende vil stoppe sløjfen (og programmet, da det er det eneste i det), når du trykker på Enter -tasten. Bemærk, at det ikke afbryder en enkelt lyd, der allerede afspilles, fordi winsound giver ikke mulighed for at gøre det, men det vil stoppe yderligere at blive spillet.


from msvcrt import getch, kbhit
import winsound

class StopPlaying(Exception): pass # custom exception

def check\_keyboard():
    while kbhit():
        ch = getch()
        if ch in 'x00xe0':  # 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')