Hintergrundmusik

Fragen zu Tkinter.
Antworten
raiminator
User
Beiträge: 31
Registriert: Dienstag 1. Mai 2012, 08:06

Moin,
ich möchte für mein Quiz eine Hintergrundmusik einrichten, die sich immer wiederholt.
Problem:
wenn ich über window.after(ms, func) die Funktion zum Sound abspielen wieder aufrufe, könnte es sein dass in der zwischenzeit die frage beantwortet wurde und der Hintergrundsound genau dann angeht während gerade der Sound für Frage richtig/Falsch abgespielt wird.
Deshalb habe ich der Funktion das aktuelle Fragen-Level (0-15) übergeben und prüfe, wenn die Funktion aufgerufen wird, ob es immernoch das gleiche ist wie das in der Globalen Variable.
der Code:

Code: Alles auswählen

from winsound import *
...
level = 0

...

def bg_sound(old_level):
    # sound nur abspielen wenn sich das level seit dem aufruf nicht verändert hat
    if level == old_level:
        if old_level < 8:
            # sound unter 8000 €-Frage, 12sek lang
            PlaySound(sound_bg1, SND_ASYNC)
            # rekursiver Aufruf
            window.after(12000, bg_sound(old_level))
        else:
            # sound über 8000 €-Frage (spannender), 20sek lang
            PlaySound(sound_bg2, SND_ASYNC)
            # rekursiver Aufruf
            window.after(20000, bg_sound(old_level))
...
Doch wenn ich das aufrufe kommt ein langer Error:
Exception in Tkinter callback
Traceback (most recent call last):
File "D:\Python\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "D:\Python\aPROGRAMME\WWM\wwm.py", line 433, in newGame
bg_sound(level)
File "D:\Python\aPROGRAMME\WWM\wwm.py", line 266, in bg_sound
window.after(20000, bg_sound(old_level))
File "D:\Python\aPROGRAMME\WWM\wwm.py", line 266, in bg_sound
window.after(20000, bg_sound(old_level))
...
# mind. 10000x
...
File "D:\Python\aPROGRAMME\WWM\wwm.py", line 266, in bg_sound
window.after(20000, bg_sound(old_level))
File "D:\Python\aPROGRAMME\WWM\wwm.py", line 266, in bg_sound
window.after(20000, bg_sound(old_level))
File "D:\Python\aPROGRAMME\WWM\wwm.py", line 266, in bg_sound
window.after(20000, bg_sound(old_level))
RuntimeError: maximum recursion depth exceeded
Das Programm friert währenddessen ein und wenn ich es dann schließe fängt es nach 10 Sekunden auf einmal an den Sound abzuspielen (nur 1x)

Was habe ich am rekursiven Aufruf falsch gemacht?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

raiminator hat geschrieben: Was habe ich am rekursiven Aufruf falsch gemacht?
Du springst einfach nie zurück; analog zu diesem Schema:

Code: Alles auswählen

def foo():
    if something:
        foo()
    else:
        foo()
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Den rekursiven Aufruf. Du sollst das nicht rekursiv aufrufen, du sollst ein callback uebergen.

Benutze dazu die Funktion functools.partial, mit der du einen neuen callback erstellst mit dem entsprechenden Parameter. Ob das dein *eigentliches* Problem loest weiss ich nicht.

Code: Alles auswählen

from functools import partial

def was_mit_nem_argument(arg): print arg

callback = partial(was_mit_nem_argument, "a da guck")

# nix passiert bisher, aber nu
callback()
raiminator
User
Beiträge: 31
Registriert: Dienstag 1. Mai 2012, 08:06

ich verstehe jetzt nicht genau den sinn von functools.partial (auch nicht aus der doku)
Wie verbinde ich das mit der Zeitverzögerung?
Antworten