这篇文章的程序与前一篇面向过程的写法实现的功能一样,但是换成了面向对象的写法,要理解这个写法,需要面向对象的知识和tkinter中各类之间的继承关系。下面这张图是从bilibili上屠夫的女婿大佬的所讲视频中截取的,供大家参考。
下面是面向对象方式编写的代码:
# GUI经典写法:面向对象的写法
# Frame框架是一个容器,放其他组件的容器
# 下面是一个测试经典的GUI程序的写法,使用面向对象的方式
from tkinter import *
from tkinter import messagebox
from aip import AipSpeech
import os
#此处我将我的APP_ID、API_KEY和SECRET_KEY去掉了,如果你想要运行成功,需要自行去百度智能云申请自己的账号并创建的语音合成应用,获得你的专属APP_ID、API_KEY和SECRET_KEY值放入下方。
APP_ID = '你的 APP_ID'
API_KEY = '你的 API_KEY'
SECRET_KEY = '你的 SECRET_KEY'
class Application(Frame):
"""一个经典的GUI程序"""
def __init__(self,master=None):#构造器,构造一个组件对象
super().__init__(master) #super代表的是父类的定义,而不是父类对象。
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""创建组件"""
self.txt01 = Text(root,width = 50,height = 12,bg ='white')
self.txt01.pack()
self.btn01 = Button(self)
self.btn01["text"] = "语音合成"
self.btn01.pack()
self.btn01['command'] = self.textToSound
def textToSound(self):
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
contents = self.txt01.get(1.0, END)
result = client.synthesis(str(contents), 'zh', 1, {'vol': 5,})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('auido.mp3', 'wb') as f:
f.write(result)
messagebox.showinfo("信息提示","语音合成成功!")
os.startfile("auido.mp3")
if __name__ == '__main__':
root = Tk()
root.geometry("600x400+200+300")
root.title("一个经典的GUI程序")
app = Application(master=root)
root.mainloop()