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
Sound im Thread
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
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.
... ehm ... Modul ist im übrigen "threading" ... beidem Sound weiß ich nicht.
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.
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
hm...das versteh ich noch nicht so ganz. Muss wohl noch was rumprobieren. Kennt denn keiner ein besseres, einfaches Soundmodul?
Gruß, jj
Gruß, jj
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
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.
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.
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
Hi,
Danke für deine Tips, ich hab's jetzt so gemacht:
Das ist schonmal ganz ok. Auch, wenns nur unter Windows geht.
Gruß, jj
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()
Gruß, jj
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
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).
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.
Das würde ich nicht über `os.name` lösen, sondern einfach versuchen die jeweiligen Module zu importieren bis ein passendes gefunden wurde.
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
Gut. Das ist sicherlich auch eine Möglichkeit. Welchen Nachteil siehst Du bei os.name ?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.
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.
-
- User
- Beiträge: 36
- Registriert: Montag 26. Februar 2007, 15:53
Das ist wohl richtig
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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 (former) Modvoice