2016-04-12 2 views
1

Я пытаюсь построить графический интерфейс Tkinter, который вроде как персональный помощник, однако я упал в кулачном препятствии :(Когда я обновляю GUI и слушаю речевое распознавание, он зависает и говорит, что не отвечает! Я понимаю, что мне нужно использовать много поточность, однако я застрял на том, как использовать его!Python многопоточность с tkinter

Вот мой код, и моя неудачная попытка при использовании многопоточности.

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 просто нужно знать, как правильно его использовать.

ps Я прочитал всю документацию и все на многопоточности, но он просто не работает: '(

Спасибо заранее :)

ответ

4

Вы призывающую ваш поток неправильно,

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

callback(tex) вызывает функцию вместо того, чтобы передавать ее в качестве цели. Если вы хотите использовать его таким образом, вы должны использовать target = lambda: callback(tex)

Вы должны использовать нить, как это:

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

Кроме того, на другой ноте, вы действительно не нужно, что функция вложен внутри вашей другую функцию, вы можете переместить ее снаружи, и она будет иметь аргумент tex, поскольку вы передаете аргумент своему потоку.

Смежные вопросы