2016-04-12 31 views
1

Ich versuche eine Tkinter GUI zu erstellen, die wie ein persönlicher Assistent ist, aber ich habe die erste Hürde genommen :(Wenn ich die GUI aktualisiere und mit Spracherkennung lausche, friert es ein und sagt nicht reagiert! ich verstehe, dass ich Multi-Threading verwenden müssen, aber ich bin fest, wie es zu benutzen!Python Multithreading mit tkinter

Hier ist mein Code und meine gescheiterten Versuch, bei Verwendung von Multi-Threading.

import tkinter as tk 
from subprocess import call as say 
import winsound 
import speech_recognition as sr 
import threading 

def cbc(tex): 

    return lambda : callback(tex) 

def callback(tex): 
    button = "Listen" 

    tex.insert(tk.END, button) 
    tex.see(tk.END)# Scroll if necessary 



def listen(tex): 
    def callback(tex): 
     g = ("Say,,your,,command,,after,,the,,beep") 
     say('espeak '+ g, shell = True) 

     winsound.Beep(1000,500) 


     ltext = 'listening...' 
     tex.insert(tk.END, ltext) 

     r = sr.Recognizer() 

     with sr.Microphone() as source: 
      damand = r.listen(source) 

     damandtxt = (recognizer_google(damand)) 
     tex.insert(tk5.END, damandtxt) 

     tex.see(tk.END) 


    t3 = threading.Thread(target = callback(tex)) 
    t3.daemon = True 
    t3.start() 

top = tk.Tk() 
tex = tk.Text(master=top) 
tex.pack(side=tk.RIGHT) 
bop = tk.Frame() 
bop.pack(side=tk.LEFT) 


tk.Button(bop, text='Listen', command=lambda: listen(tex)).pack() 
tk.Button(bop, text='Exit', command=top.destroy).pack() 

top.mainloop() 

I muss nur wissen, wie man es richtig benutzt. Bitte

ps Ich habe alle Unterlagen und alles auf Multi-Threading lesen, aber es funktioniert einfach nicht: '(

Vielen Dank im Voraus :)

Antwort

4

Du nennst deinen Thread falsch,

t3 = threading.Thread(target = callback(tex)) 

callback(tex) ruft die Funktion auf, anstatt sie als Ziel einzugeben. Wenn Sie es verwenden, um diese Art und Weise wollen Sie target = lambda: callback(tex)

verwenden müssen, sollten Sie den Faden wie diese verwenden:

t3 = threading.Thread(target = callback, args=(tex,)) 

Auch auf einer anderen Anmerkung, die Sie wirklich brauchen nicht über diese Funktion verschachtelt innerhalb Ihrer andere Funktion, können Sie es nach draußen bewegen und es wird die tex Argument haben, da Sie das Argument zu Ihrem Thread übergeben.