使用线程同时使用Python进行两件事

时间:2019-01-11 17:00:15

标签: python multithreading messagebox pyttsx

我正在创建一个小程序,只是为了好玩,它会打开程序并执行类似的操作。

我正在进行Wikipedia搜索,程序将读出它,我希望MessageBoxW将文本写到屏幕上。

我希望这两个事情同时发生,因为现在它首先显示消息框,而在我关闭窗口之后,它正在读取文本

def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxW(0, text, title, style)

def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxW(0, text, title, style)


def wikipediaSearch():
    global user_input

    user_input = user_input.replace("search", '')
    result = wikipedia.summary(user_input, sentences=2)

    raw_text = result
    convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii', 'ignore')
    convert_text = convert_text.decode('utf-8')
    new_text = re.sub(r'\(.*\)', '', convert_text)
    print(new_text)

    Mbox(user_input, new_text, 0)

    voice.say(new_text)
    voice.runAndWait()

1 个答案:

答案 0 :(得分:1)

创建在单独的线程中运行.my_block_1 { display: none; } .home .my_block_1 { display: block; } 的帮助程序类:

pyttsx

因为pyttsx的行为类似于singleton,并且任何时候pyttsx的一个实例都可以在同一Python进程中讲话,所以我将全局变量封装到import threading import pyttsx class Say(object): """Function-like class to speak using pyttsx.""" _thread = None def __init__(self, message): if not isinstance(message, str): raise ValueError("message is not a string") if Say._thread is not None: Say._thread.join() Say._thread = None Say._thread = threading.Thread(target=self._worker, name="Say", args=(message,)) Say._thread.start() def _worker(self, message): engine = pyttsx.init() engine.say(message) engine.runAndWait() def WaitAllSaid(): if Say._thread is not None: Say._thread.join() Say._thread = None 类中,并拥有实例构造函数等待所有现有语音完成,然后启动一个新线程让pyttsx讲话。

基本上,Say等待进行中的所有话语完成,然后开始说新的声音,然后返回。它不等待消息完全说完再返回。它会在消息开始时立即返回。

Say(message)等待正在进行的所有发言,然后获取工作线程。如果要修改pyttsx引擎或语音属性,请首先调用WaitAllSaid(),以确保当时没有语音在进行。否则可怜的pyttsx可能会感到困惑。

OP的WaitAllSaid()函数的最后四行现在变成类似

wikipediaSearch

如果pyttsx已经在讲话,则 print(new_text) Say(new_text) Mbox(user_input, new_text, 0) WaitAllSaid() 会阻塞,直到所有先前的消息都说完为止。当指定的消息开始播放时,它将立即返回。

Say()只是blocks,直到说出的所有内容都说完为止。只要确保在Python程序退出之前调用WaitAllSaid(),就可以从wikipediaSearch()函数中忽略它。

在不太精确的常规设计上:至少在Linux上,如果人们试图对单独的语句使用相同的pyttsx对象,则pyttsx会出现问题。使用助手线程创建实例效果更好。在Linux上测试时,这种模式是全局变量和各种形式的单例类中最可靠的一种。我根本不使用Windows,las,我无法对其进行测试。