Tyinter主循环在使用pyttsx讲话后意外退出

问题描述 投票:0回答:3

我正在创建一个使用tkinter和pyttsx与用户进行交互的小程序。出于某种原因,脚本在说了“单击按钮”之后退出,而脚本应留在主循环中。甚至更陌生,它甚至没有通过我在主循环下面添加的“检查点”。

这里是产生错误的代码的简化版本:

import Tkinter as tk
import pyttsx

def button_click():
    engine.say('button clicked')
    engine.runAndWait()

engine = pyttsx.init()

root = tk.Tk()
gameframe = tk.Frame(root)
gameframe.pack()
readybutton = tk.Button(gameframe, text = 'click', command = button_click)
readybutton.pack()

root.mainloop()

print('checkpoint')

如何解决此问题?

更新:通过Google,我发现一些迹象表明该问题可能与使用事件循环的tkinter和pyttsx以及苹果的Foundation和/或ObjC模块如何处理事件有关。由于我是Python的新手,因此我不太了解它,但有些人可能会看到http://comments.gmane.org/gmane.comp.python.pyobjc.devel/5965

[我还发现了一种几乎非常简单的,针对Mac的解决方法,可以避免完全使用pyttsx:

import os

phrase = 'button clicked'
os.system("/usr/bin/say " + phrase)

这很好,也可以与tkinter :-)结合使用>

我正在创建一个使用tkinter和pyttsx与用户进行交互的小程序。出于某种原因,脚本在说了“单击按钮”之后退出,而脚本应留在主循环中。 ...

python tkinter text-to-speech
3个回答
0
投票

什么使您认为它正在退出主循环?如果没有到达最后的打印语句,则主循环没有“退出”,则您的程序崩溃了。根据您提供的证据,崩溃发生在方法engine.runAndWait()中。


0
投票

pyttsx当您从不同的线程调用它的Engine方法时,即使它们从未在时间上重叠,它们也会崩溃。 (不仅是runAndWait


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.