Sprachausgabe

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
-=Flex=-
User
Beiträge: 4
Registriert: Dienstag 20. März 2018, 09:37

Nach dem mein Anfang ein wenig holprig war möchte ich hier gerne versuchen es besser zu machen.

Also die Aufgabe war es ein kleines Programm zu schreiben das einen geschriebenen Text über die Hauseigene Computerstimme ausgibt. Dabei war mir wichtig das die Bestätigung (des eingegebenen Textes) sowohl über die "Return"-Taste als auch über ein Button funktioniert.
Des weiteren wollte ich die Möglichkeit von einigen wenigen Standardsätzen haben. Das heißt über die Betätigung verschiedener Button sollten direkt die Sätze aus gegeben werden.

So ich habe die Hoffnung das sich der ein oder andere diesen Code vielleicht doch ansieht und mir meine Fehler zeigt. Ich gehe davon aus das es einiges gibt das man anderes machen müsste. Zum Beispiel die Umsetzung der Standardsätze finde ich selbst hässlich.

Code: Alles auswählen

from tkinter import *
import win32com.client

"""
Stimme
------------------------------------------------------------
Es greift auf die Windows eigene Stimme zu.
Es ist möglich eine Eingabe von Hand zu tätigen oder einen Standardsatz
aus zu wählen.
"""

class Stimme():
    def __init__(self):
        
        self.fenster = Tk()
        self.stimme = win32com.client.Dispatch("SAPI.SpVoice")

        self.fenster.title( "Stimme v2.1" )

        self.frame_oben = Frame( master = self.fenster, relief = RIDGE, bd = 3 )
        self.frame_oben.pack(padx = 10, pady = 10)
        
        self.frame_unten = Frame(master = self.fenster, relief = RIDGE, bd = 3 )
        self.frame_unten.pack(padx = 10, pady = 10)
        
        self.eingabe = Entry( master = self.frame_oben, width = 60 )
        self.eingabe.pack(padx = 10, pady = 10)
        self.eingabe.bind( "<Return>", self.sprachausgabe_entry )
        
        self.button = Button( master = self.frame_oben, text = "Sprechen", width = 10, height = 3)
        self.button.pack(padx = 10, pady = 10) 
        self.button.bind( "<Button-1>", self.sprachausgabe_entry )
        
        self.beispiel1 = Button( master = self.frame_unten, text = "Blödmann!", width = 54 )
        self.beispiel1.pack()
        self.beispiel1.bind( "<Button-1>", self.sprachausgabe_beispiel1 )

        self.beispiel2 = Button( master = self.frame_unten, text = "Wie geht es dir?", width = 54 )
        self.beispiel2.pack()
        self.beispiel2.bind( "<Button-1>", self.sprachausgabe_beispiel2 )

        self.beispiel3 = Button( master = self.frame_unten, text = "Wie ist das Wetter heute?", width = 54 )
        self.beispiel3.pack()
        self.beispiel3.bind( "<Button-1>", self.sprachausgabe_beispiel3 )
        
        self.fenster.mainloop()
        
    def sprachausgabe_entry(self, event):
        self.txt = self.eingabe.get()
        self.stimme.speak( self.txt )
        self.eingabe.delete( 0, len(self.txt) )
        
    def sprachausgabe_beispiel1(self, event):
        self.txt = "Blödmann!"
        self.stimme.speak( self.txt )
        
    def sprachausgabe_beispiel2(self, event):
        self.txt = "Wie geht es dir?"
        self.stimme.speak( self.txt )
        
    def sprachausgabe_beispiel3(self, event):
        self.txt = "Wie ist das Wetter heute?"
        self.stimme.speak( self.txt )
        


def main():
    vocal = Stimme()

if __name__ == "__main__":
    main()


P.S.: Danke dafür: viewtopic.php?f=1&t=26700&p=201865&hili ... be#p201865
hat sehr geholfen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@-=Flex=-: keine *-Importe, üblicherweise wird `import tkinter as tk` geschrieben und alle Namen per tk. referenziert. __init__ ist zum Initialisieren da, mainloop hat darin nichts verloren, da dann ja die Initialisierung nie fertig wird. Man muß nicht alles an Attribute binden, außer `stimme` und `eingabe` ist eigentlich nichts nötig. Buttons sind zum Klicken da, also `command` und nicht `bind` benutzen.

Code: Alles auswählen

import tkinter as tk
from functools import partial
import win32com.client

class Stimme(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title( "Stimme v2.1" )
        self.stimme = win32com.client.Dispatch("SAPI.SpVoice")

        frame_oben = tk.Frame(master=self, relief=tk.RIDGE, bd=3)
        frame_oben.pack(padx=10, pady=10)
        
        frame_unten = Frame(master=self, relief=tk.RIDGE, bd=3)
        frame_unten.pack(padx=10, pady=10)
        
        self.eingabe = Entry(master=frame_oben, width=60)
        self.eingabe.pack(padx=10, pady=10)
        self.eingabe.bind( "<Return>", self.sprachausgabe_entry)
        
        button = Button(master=frame_oben, text="Sprechen",
            width=10, height=3, command=self.sprachausgabe_entry)
        button.pack(padx=10, pady=10) 

        for text in ["Blödmann!", "Wie geht es dir?", "Wie ist das Wetter heute?"]:
            Button(master=frame_unten, text=text, width=54,
                command=partial(self.stimme.speak, text)).pack()
        
    def sprachausgabe_entry(self, event=None):
        txt = self.eingabe.get()
        self.stimme.speak(txt)
        self.eingabe.delete(0, len(txt))

def main():
    vocal = Stimme()
    vocal.mainloop()

if __name__ == "__main__":
    main()
-=Flex=-
User
Beiträge: 4
Registriert: Dienstag 20. März 2018, 09:37

Sirius3 hat geschrieben:@-=Flex=-: keine *-Importe, üblicherweise wird `import tkinter as tk` geschrieben und alle Namen per tk. referenziert.
Gemerkt und aufgeschrieben!
Sirius3 hat geschrieben: __init__ ist zum Initialisieren da, mainloop hat darin nichts verloren, da dann ja die Initialisierung nie fertig wird.
Mist da hätte ich auch drauf kommen können
Sirius3 hat geschrieben:Man muß nicht alles an Attribute binden, außer `stimme` und `eingabe` ist eigentlich nichts nötig. Buttons sind zum Klicken da, also `command` und nicht `bind` benutzen.
Okay da muss ich wohl nochmal nach lesen.


Den Abschnitt da unten finde ich genial. Ich habe Tage lang eine Möglichkeit gesucht wie ich die drei Buttons erstellen kann und den entsprechenden Text an die Sprachausgabe übergeben kann. Obendrein kommt der "packer" direkt hinten dran .... wie gesagt genial!
Sirius3 hat geschrieben:

Code: Alles auswählen

for text in ["Blödmann!", "Wie geht es dir?", "Wie ist das Wetter heute?"]:
            Button(master=frame_unten, text=text, width=54,
                command=partial(self.stimme.speak, text)).pack()
P.S.: Danke für die Wahnsinns Antwort!
Antworten