我正在创建一个小程序,只是为了好玩,它会打开程序并执行类似的操作。
我正在进行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()
答案 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,我无法对其进行测试。