首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止pyttsx3冻结图形用户界面

防止pyttsx3冻结图形用户界面
EN

Stack Overflow用户
提问于 2019-10-31 00:36:33
回答 1查看 645关注 0票数 2

我已经构建了Kivy GUI,它可以使用pyttsx3进行语音输出,但是当我运行pyttsx3时,它会阻塞主线程,从而导致图形用户界面冻结。

我如何在另一个线程上运行pyttsx3,并从主线程听到输出,或者是否有一种方法可以在不阻塞主线程的情况下运行pyttsx3,并防止它冻结我的Kivy GUI?

这是我创建的示例代码,当您单击按钮时,它应该会打印文本框中的文本,但它会导致图形用户界面在pyttsx3运行时冻结:

代码语言:javascript
运行
复制
import pyttsx3
from kivy.uix.textinput import TextInput
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.app import App



engine = pyttsx3.init()

engine.setProperty('rate', 150)
engine.setProperty('volume', 1)

class example(App):

    def build(self):

        layout = FloatLayout()

        self.textbox = TextInput(text="", multiline=False, font_size=12, size_hint_y=None, size_hint_x=None, width = 150, height = 30, pos_hint= {"x":0.4, "y":0.8})



        self.btnText = Button(text="Print text", font_size=12, size_hint_y=None, size_hint_x=None, width = 150, height = 30, pos_hint= {"x":0.4, "y":0.6})
        self.btnText.bind(on_press=self.print)


        layout.add_widget(self.textbox)
        layout.add_widget(self.btnText)

        return layout

    def print(self, instance):
        engine.say("this is an example of kivy being blocked my pyttsx3")
        engine.runAndWait()
        print(self.textbox.text)



if __name__ == '__main__':
    example().run()

我尝试过这样做,如下:

代码语言:javascript
运行
复制
thread2 = threading.Thread(target=engine.say, args = ("some text here",))
thread2 = threading.Thread(target=engine.runAndWait(),)
thread2.start()
thread2.join()

但是上面的代码仍然会阻塞线程,并导致Kivy GUI冻结。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-31 02:11:43

正如他指出的,你必须在一个线程中运行它:

代码语言:javascript
运行
复制
import threading

# ...

class example(App):
    # ...

    def print(self, instance):
        threading.Thread(
            target=self.run_pyttsx3, args=(self.textbox.text,), daemon=True
        ).start()

    def run_pyttsx3(self, text):
        engine.say(text)
        engine.runAndWait()

# ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58630010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档