先上源代码:
from tkinter import *
import tkinter.messagebox
import pyttsx3
import sys
tk = Tk()
tk.title("Speaker")
L = Label(tk, text="Text to read")
L.grid(row=0, column=0)
T = Text(tk, width=30, height=30)
T.grid(row=1, column=0)
E = Entry(tk)
E.grid(row=2, column=0)
L1 = Label(tk, text="Repeat times")
L1.grid(row=2, column=1)
man = pyttsx3.init()
def say():
text = T.get("0.0", "end")
man.say(text)
man.runAndWait()
def _quit():
cmd = tkinter.messagebox.askyesno("Speaker", "Are you sure you want to quit?")
if cmd:
tk.destroy()
sys.exit()
def delete():
T.delete("0.0", "end")
def loop_speak():
text = T.get("0.0", "end")
for x in range(int(E.get())):
man.say(text)
man.runAndWait()
B = Button(tk, text="Speak", command=say)
B.grid(row=3, column=0)
B1 = Button(tk, text="Loop speak", command=loop_speak)
B1.grid(row=3, column=1)
B2 = Button(tk, text="Clear", command=delete)
B2.grid(row=3, column=2)
tk.protocol("WM_DELETE_WINDOW", _quit)
tk.mainloop()
在运行这个程序之前,我们先要安装pyttsx3模块。安装方法:pip install pyttsx3。
首先,我们先导入了在程序中需要使用的模块。tkinter用于显示图形化用户界面(Graphical User Interface, GUI),tkinter.messagebox用于弹出提示框,pyttsx3用于调用语音接口,sys用于退出程序。
首先,我们先在界面上放置了Text()文本域控件和Label()标签控件及Entry()文本输入框控件。随后,我们初始化了pyttsx3模块,并把pyttsx3这个类复制给变量man。然后,我们定义say()函数。在say()函数中,我们首先使用Text对象的get()方法获取了文本域中的文本,并把文本赋值给text变量。随后,我们使用man.say()让电脑阅读。不过出于某种原因,只有调用man.runAndWait()才会使电脑发出声音,因此我们在这里做了一个调用。
下面我们定义了一个_quit()函数。这个函数的作用是弹出一个提示框,询问用户是否确认要退出。如果用户单击弹出的提示框的“是”按钮,该提示框对象会返回True,如果if cmd:为True,tkinter窗口调用destroy()方法进行销毁,再使用sys.exit()彻底退出程序。
下面是delete()函数。该函数将会调用Text对象的delete()方法,清空文本域中的所有文本。在这里我们把该对象的该方法封装为一个函数,以方便调用。
后面是loop_speak()函数。该函数可以让电脑重复发出声音指定次数。首先,我们先从文本域中获取文本并赋值给text,随后,我们使用for x in range(int(E.get())):循环指定次数。range()函数会产生一个数组,但是比数组更为高效。如果你输入range(3),便会得到[0,1,2],len()该列表,会得到数值3,进而该for循环会循环3次。E.get()函数会返回字符串,因此我们要使用int()函数把这个字符串转换为数字。在for循环的循环体中,我们调用man.say()和man.runAndWait(),以实现循环指定次数。
最后,我们放置一些按钮,并把按钮绑定要触发的函数。同时,我们使用tk.protocol()方法绑定右上角“x“点击事件,如果”x“被点击,则调用_quit()函数。最后,我们使用tk.mainloop()进入窗口主循环,使程序运行。