使用tkinter进行Python多线程处理

时间:2016-04-12 20:35:58

标签: python windows python-3.x tkinter python-multithreading

我试图构建一个类似于个人助理的Tkinter GUI,但是我已经陷入了第一道障碍:(当我更新GUI并听取speech_recognition时,它冻结并说没有回应!我明白我需要使用多线程,但我仍然坚持如何使用它!

这是我的代码以及我尝试使用多线程的失败。

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()

我只需要知道如何正确使用它。请

p.s我已经阅读了多线程的所有文档和所有内容,但它不起作用:'(

提前谢谢你:)

1 个答案:

答案 0 :(得分:4)

你没有错误地调用你的帖子,

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

callback(tex)正在调用该函数,而不是将其作为目标传递。如果您想以这种方式使用它,则需要使用target = lambda: callback(tex)

你应该使用这样的线程:

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

另外在另一个注意事项中,你真的不需要嵌套在你的其他函数中的函数,你可以将它移到外面并且它会有tex争论,因为你将争论传递给你的主题