Wie kann ich das anders Umsetzen (Python 3)?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ich hätte das Zusammenspiel der Dateien geändert.

Du musst deine zweite Python Datei nicht als über die Kommandozeile als separates Programm aufrufen. Du kannst dein Python Code auch in zwei Dateien aufteilen und den Code über verschiedene Dateien aufrufen.

Ich würde wahrscheinlich auch eine eigene Klasse erzeugen.

Die main.py würde dann im etwa so aussehen:

# Klasse der anderen Python Datei importieren
from playlist1 import Playlist1

# Instanz der eigenen Klasse im Hauptprogramm erzeugen
playlist1 = Playlist1()

while True:
  txt = [Spracheingabe] # dein Code
  // Auf neue Eingabe hören.

  # die if Verschachtelungen kann man verbinden
  if 'spiel' in txt and 'playlist' in txt and '1' in txt:
    say("Playlist 1 wird Wiedergegeben.")

    # Funktion der Klasse aufrufen
    playlist1.play()

  if 'pause' in txt:
    say("Musik wird Pausiert")

    # Funktion der Klasse aufrufen
    playlist1.pause()

und playlist1.py:

# imports

# Klasse mit dem Namen definieren
class Playlist1:

  # Existenz der Member Variable pygame angeben
  pygame = none

  # Konstruktor: wird beim Erzeugen der Klasse aufgerufen
  def __init__(self):
    self.pygame = pygame.init()

  def play(self):
    self.pygame.mixer.music.load('[Pfad]')
    self.pygame.mixer.music.play()

  def pause(self):
    self.pygame.mixer.music.pause()

Das sollte es im groben auch schon sein.

Nach einem kurzen Blick in die Doku von pygame scheint das Tool bereits Multi Threaded zu sein. Nach dem Aufruf von play() läuft der Code weiter und die Musik wird weiterhin abgespielt.

Die pygame Instanz sollte nur die ganze Zeit bestehen bleiben, da sonst vermutlich die Musik abbricht.

Durch ein "while True" vor der Spracheingabe wird das Hauptprogramm nicht geschlossen, sodass die Musik weiterhin spielt. Du musst also nicht durch "get_busy()" das Programm am Laufen erhalten.

Das "while True" habe ich mir dazu gedacht. Falls es noch kein Bestandteil ist, müsste die Abfrage für einen neuen Sprach Input in einer Schleife liegen. Hier solltest du auch ohne Probleme ein sleep Funktion aufrufen können.


iNeedHelp961 
Fragesteller
 18.11.2021, 18:40

Danke! Ich bin gerade nicht am PC aber ich Versuche es heute Nacht. Das while hab ich vergessen in die playlist1.py zu packen (War nur in der Main.py).

0
iNeedHelp961 
Fragesteller
 18.11.2021, 21:01

Hey danke! Jetzt wird es aber bisschen verwirrend Leider. Unzwar will ich ja dabei noch weiter aufnehmen was der User sagt aber es kommt eine Exception das nicht geredet wird. Ich hatte das eigentlich so geregelt das ich das ganze Programm neu Aufrufe wenn keine Eingabe gekommen ist. Naja jetzt das Problem das ich das Programm nicht neustarten darf weil ja sonst die Musik ausgeht. Hast du da evt auch eine Idee?

Hier meine getSpeak Funktion:

def getSpeak():
     with sr.Microphone() as source:
        print("Sagst du was")
        audio = r.listen(source)
        print("Gut gemacht, Aschlo")

        try:
            txt = r.recognize_google(audio, language="de-DE")
            print(txt)
        except sr.UnknownValueError:
            print("Musst du reden ich muss verstehen")
0
iNeedHelp961 
Fragesteller
 18.11.2021, 21:02
@iNeedHelp961

Ach ne habs schon ich hab einfach txt einen wert gegeben auch im UnknownValueError

0
tide1109  18.11.2021, 21:50
@iNeedHelp961

Zum Abfangen von Fehler gibt es den try und except Block, welchen du auch schon benutzt.

Anstatt die txt Variable mit einem leeren String "" zu füllen, kannst du auch die Funktion mit "return" vorzeitig beenden. So wird die Variable gar nicht erst bentutzt und die undefined Exception tritt nicht auf.

Vielen Wege führen ans Ziel. So ist es bei deiner Variante auch der Fall.

1
iNeedHelp961 
Fragesteller
 18.11.2021, 22:06
@tide1109

Danke du bist Wircklich ein Hilfbereiter netter Mensch!

0