我正在创建一个使用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与用户进行交互的小程序。出于某种原因,脚本在说了“单击按钮”之后退出,而脚本应留在主循环中。 ...
什么使您认为它正在退出主循环?如果没有到达最后的打印语句,则主循环没有“退出”,则您的程序崩溃了。根据您提供的证据,崩溃发生在方法engine.runAndWait()
中。
pyttsx当您从不同的线程调用它的Engine方法时,即使它们从未在时间上重叠,它们也会崩溃。 (不仅是runAndWait