Domanda Libreria playsound in python, eseguire funzione a fine riproduzione

Sevenjeak

Utente Gold
23 Settembre 2010
336
59
26
206
Salve,

Sto in questi giorni, lavorando con la libreria playsound per riprodurre un suono e, come da titolo vorrei sapere se la libreria playsound mette a disposizione un metodo eseguito alla fine della riproduzione del suono, cosi da eseguire una funzione quanto si verifichi tale evento.

Esiste un metodo della libreria che faccia ció? O devo usare un'altra libreria?
 
Se vuoi usare la stessa libreria l'unica è passare l'argomento Block = True e chiamare la tua funzione subito dopo playsound

Python:
playsound('file.mp3', True)
fine_riproduzione()

Per come è implementata è incompatibile con la modifica cross-platform per eseguire una funzione in modo asincrono alla fine, quindi se è quello che ti serve meglio un'altra libreria.
 
cosi il codice mi va, ma il programma si blocca durante la riproduzione, credo che sia perché non sia asincrono giusto?

che altra libreria mi consigli di utilizzare?
Messaggio unito automaticamente:

ok, cosi il codice mi va, ma il problema è che mentre il suono viene riprodotto, l'app ( che nel mio case e una finestra fatta con tkinter ) si blocca, credo che sia perché non sia asincrono giusto?

che altra libreria mi consigli di utilizzare?
 
ok, cosi il codice mi va, ma il problema è che mentre il suono viene riprodotto, l'app ( che nel mio case e una finestra fatta con tkinter ) si blocca, credo che sia perché non sia asincrono giusto?

che altra libreria mi consigli di utilizzare?

Si, è per quello. Non conosco molte librerie in python ma da una ricerca sembra che pygame.mixer.music ha la riproduzione asincrona e la gestione degli eventi che ti serve e che puoi interrogare dal tuo main loop di tkinter.

In alternativa una soluzione un po' più "rozza" potrebbe essere eseguire playsound blocking in un altro thread:
Python:
import threading

# ...

def riproduci_thread(sound):
    playsound(sound, True)
    fine_riproduzione();

def riproduci():
    threading.Thread(target=riproduci_thread, args=('file.mp3',), daemon=True).start()

Ma questo metodo ha dei limiti e potrebbe non essere compatibile con quello che vuoi fare nella funzione fine_riproduzione per esempio operazioni non thread-safe. Inoltre non so come si comporterebbe playsound (e la libreria di sistema che usa) se provi a chiamare riproduci più volte senza aspettare che abbia finito. Per questo ti consiglio qualcosa come l'altra libreria o quelle che riesci a trovare tu.
 
Premetto che ora non sono al pc, appena posso proveró la soluzione con i thread e con la libreria pygame, anche se quest'ultima mi sembra migliore credo che le proverò tutte e due.

Grazie delle risposte date