Sound im Thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Mittwoch 28. Februar 2007, 18:13

Hallo!
Ich habe ein Script mit Tkinter, in dem ich Sound brauche. Das es mit Tkinter ist, ist glaub ich zweitrangig, desshalb schreibe ich es hier unter "Allgemeine Fragen". Tkinter heißt nur, dass das Programm in einer Endlosschleife läuft, und somit Threads benötigt werden.
So, meine Fragen dazu:

1) Welches modul soll ich nehmen?
Es sollte möglichst plattformübergreifend sein. Jetzt hab ich winsound in nem try-import etc., weil es standardmäßig bei Windows dabei ist. Alles was ich sonst gefunden habe, muss man erst mehr oder weninger aufwändig installieren. Außerdem muss ich nur Sound abspielen, und nicht verändern oder optisch darstellen.

2) Wie mach ich das dann?
Wie erwähnt, muss ich ja wohl threads benutzen. Das ist ja mit Tkinter ein Problem, wenn ich den mainloop von Tkinter beende, denn der Tread läuft ja weiter, oder? Kann man einen Thread beenden?

Gruß, jj
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Mittwoch 28. Februar 2007, 20:22

Hallo, wenn ich mich nicht täusche dürfte "thread.setDaemon(1)" erreichen was Du willst. Es bewirkt das der neu kreierte Thread automatisch mit dem Terminieren des Mainthreads beendet wird.

Code: Alles auswählen

thrd = threading.Thread(target = threadcode, name = "Childthrd")
thrd.setDaemon(1)
thrd.start()

... ehm ... Modul ist im übrigen "threading" ... beidem Sound weiß ich nicht.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Freitag 2. März 2007, 18:50

hm...das versteh ich noch nicht so ganz. Muss wohl noch was rumprobieren. Kennt denn keiner ein besseres, einfaches Soundmodul?
Gruß, jj
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Samstag 3. März 2007, 10:34

Du willst den Thread doch nutzen um einen Sound zu spielen wenn in Deinem Fenster etwas bestimmtes geschieht oder ? Um das möglich zu machen willst Du einen weiteren Thread starten der auf eine Eingabe aus dem Fenster wartet umd dann dafür zu sorgen das dieser Sound gespielt wird, richtig ?

Wie sieht denn Dein bisheriger Code aus und an welche Bedingung willst Du den Sound koppeln ? Also ich würde wenn ich Dich richtig verstanden habe eine eigene Thread-Klasse erstellen indem ich von threading.Thread erbe und
dieses neue Threadobjekt im Code dieser Fensterklasse erstellen.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Sonntag 4. März 2007, 14:09

Hi,
Danke für deine Tips, ich hab's jetzt so gemacht:

Code: Alles auswählen

import Tkinter as tk
import winsound as ws
import threading as th

class SoundThread(th.Thread):
    def __init__(self,path):
        th.Thread.__init__(self)
        self.path=path
    def run(self):
        ws.PlaySound(self.path,ws.SND_FILENAME)

class TestGUI:
    def __init__(self):
        self.master=tk.Tk()
        self.b=tk.Button(text="test",font=("",15,""),command=self.makesound)
        self.b.pack()
    def makesound(self):
        sound=SoundThread("test.wav")
        sound.setDaemon(1)
        sound.start()

test=TestGUI()
test.master.mainloop()
Das ist schonmal ganz ok. Auch, wenns nur unter Windows geht.
Gruß, jj
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Sonntag 4. März 2007, 16:28

Das sieht doch schonmal gut aus.

Du kannst doch über "os.name" das Betriebssystem abfragen und einen bedingten Import vornehmen je nachdem ob das System auf Windows oder Linux läuft (bezüglich des Sounds meine ich).
Zuletzt geändert von Grossmeister_C am Sonntag 4. März 2007, 16:43, insgesamt 1-mal geändert.
BlackJack

Sonntag 4. März 2007, 16:34

Das würde ich nicht über `os.name` lösen, sondern einfach versuchen die jeweiligen Module zu importieren bis ein passendes gefunden wurde.
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Sonntag 4. März 2007, 16:36

BlackJack hat geschrieben:Das würde ich nicht über `os.name` lösen, sondern einfach versuchen die jeweiligen Module zu importieren bis ein passendes gefunden wurde.
Gut. Das ist sicherlich auch eine Möglichkeit. Welchen Nachteil siehst Du bei os.name ?
BlackJack

Sonntag 4. März 2007, 16:58

Da sehe ich den Nachteil, dass man eventuell eine Plattform nicht berücksichtigt die aber passende Module anbietet, bzw. das die Zuordnung von Modulen zu Plattformen nicht 1:1 ist. `winsound` und `alsaaudio` sind relativ eindeutig aber `pygame.mixer` ist nicht eindeutig einer Plattform zuzuordnen.
Grossmeister_C
User
Beiträge: 36
Registriert: Montag 26. Februar 2007, 15:53

Sonntag 4. März 2007, 17:10

Das ist wohl richtig :D
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Sonntag 4. März 2007, 21:05

Also das script oben war ja nur der test der funktionalität, weil ich weiß ja, dass ich auf windows bin. In meinem richtigen script, in das ich die lösung jetzt eingebaut habe, hab ich das schon gelöst. Ich habs in etwa so gemacht, dass ich den import in eine try-anweisung gepackt habe, und dazu eine variable, die anzeigt, ob winsound importiert wurde. Alle sounds die ich spielen will, rufe ich über eine funktion auf, in der ich erst auf diese variable teste. Wenn der test negativ ist, passiert halt nichts, oder eine Fehlermeldung wird ausgegeben.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 4. März 2007, 23:09

Kann man etwa so - vergleichweise elegant, da ohne unnötige Variablen - lösen:

Code: Alles auswählen

import sys

try:
    import winsound
except ImportError:
    winsound = False

if not winsound:
   sys.exit(1)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten