用python写一个程序,然后在命令行上执行,看不到界面(UI),这种程序很常见了,叫命令行程序。然而很多人,特别是不懂程序的人,更需要看到的是一个有界面的,能通过鼠标操作的程序,毕竟已经迈进“窗口”的时代,虽然Dos还存在。所以,怎么用python弄出有界面的程序呢?

界面也是一个工具,所以,有没有界面工具库呢?必须得有,而且有很多个,你搜索“python界面库”就可以看到很多这方面的介绍,而我要介绍的,是python最早就有的tkinter,通过它来实现界面程序。

tkinter内置在python中,所以不用再安装,直接import进来使用就是了。沿用上一节介绍的文本转语音的程序,我现在要写一个界面程序,上面有两个按钮,一个用来选择文本文件,一个是“转换成语音”,来看看怎么实现吧。

(1)TTS的GUI程序

from tkinter import *
import tkinter.messagebox as msgbox
import tkinter.filedialog as filedlg
import os
import pyttsx3
from pydub import AudioSegment
import threading txtfile = ""
window = Tk()
pathlabel = Label(window, text="...") def fileFunc():
default_dir = "文件路径"
global txtfile
global pathlabel
txtfile = filedlg.askopenfilename(title="选择文件", initialdir=(os.path.expanduser(default_dir)))
(path, fname) = os.path.split(txtfile)
pathlabel["text"] = fname def converThreadFunc(content):
outfile = "out.aiff"
tts = pyttsx3.init()
tts.save_to_file(content, outfile)
tts.runAndWait() def convertFunc():
if len(txtfile) == 0:
msgbox.showinfo("提示", "请先选择文本文件")
return
content = open(txtfile, "r", encoding="utf-8").read()
if len(content)==0:
msgbox.showinfo("提示", "文本文件没有内容,转换终止,不输出语音文件")
return
t1 = threading.Thread(target=converThreadFunc, args=(content,))
t1.start()
t1.join()
outfile = "out.aiff"
AudioSegment.from_file(outfile).export("out.mp3", format="mp3")
msgbox.showinfo("提示", "转换成功,程序目录下的out.mp3就是最终的语音文件:%s" % os.getcwd())
os.system("open '%s'" % os.getcwd()) def main():
window.title("TTS-文本转换语音")
window.geometry("320x320+100+100")
filebtn = Button(window, text="选择文本文件", command=fileFunc)
convertbtn = Button(window, text="转换成语音", command=convertFunc)
filebtn.place(x=10, y=10)
pathlabel.place(x=10, y=40)
convertbtn.place(x=10, y=80)
window.mainloop() if __name__=="__main__":
main()

抓重点来看。

1、使用了tkinter的控件,messagebox是提示框,filedialog是文件选择控件,再比如Button跟Label,这些都是常用的控件,它们的创建跟属性设置,也有不少详情,你可以搜索来了解。

2、这里用place方法来设置控件的位置,类似的方法还有pack、grid等。

3、业务逻辑上,重点是处理两个按钮的点击事件,也就是那两个def出来的xxFunc函数了。

4、文本转语音的处理,使用了上节介绍的代码,也没有什么神秘的。

5、pyttsx3.engine的函数runAndWait在执行完后会结束当前线程,所以,不能在主线程即UI线程来执行这个函数,而要启动一个thread来执行它,否则runAndWait执行后主界面就会消失,这不是预期的事情。

运行起来后的一个截图是这样的:

程序弄好了,先不管它丑不丑吧,至少功能可以用了。如果是自己使用的话,那怎么样才能快速地启用这个程序呢?

(2)结合alfred来调用程序

之前介绍过怎么在mac系统上快速地切换或启动一个程序,使用的工具就是alfred,这是一个超级好用的工具。那现在再次使用alfred来启用刚才写的程序。

关于alfred的安装或使用,网上很多介绍,我之前介绍“mac环境与工具”时也有介绍,但是,这里有一个地方要注意:手动用终端执行上面的python程序是可以正常运作的,但一旦通过alfred执行python程序,那在AudioSegment.form_file时就会异常,最终export不出语音文件,就算直接在python代码中执行ffmpeg命令也一样会失败,判断是,alfred执行python脚本的情况下,AudioSegment(包括它使用的ffmpeg)没有权限访问文件。 考虑到这种情况,就要变通一下了:让alfred打开一个新的终端,并且让这个终端执行python程序--按这个思路来制作工具。

1、在alfred上新建一个“Script Filter”:

2、新的terminal会执行cmd.sh脚本,这个脚本是这样的:

cd '/Users/freejet/Library/Application Support/Alfred 3/Alfred.alfredpreferences/workflows/user.workflow.4D91A493-39F3-433C-9D33-65917236A6F5'
source ~/Desktop/pyenv/bin/activate
python3 demo_gui.py

先是cd到这个alfred脚本即workflow所在的目录,这个目录路径你可以通过右键workflow找到,然后激活python3的环境(第一节介绍到的内容),最后执行python程序也就是上面介绍的“TTS的GUI程序”。

把这个cmd.sh放到当前workflow的目录中,这样alfred才能找到它。

3、执行一下,效果是这样的:

最后的那个out.mp3就是最终想要的文件,你可以听一下(如果你是在公众号内看到这篇文章的话):

(out.mp3试听)

对应的文本是这样的:

瑶草一何碧,春入武陵溪。溪上桃花无数,花上有黄鹂,我欲穿花寻路,直入白云深处,浩气展虹霓。只恐花深里,红露湿人衣。坐玉石,欹玉枕,拂金徽。谪仙何处,天人伴我白螺杯。我为灵芝仙草,不为朱唇丹脸,长啸亦何为!醉舞下山去,明月逐人归。——宋.黄庭坚《水调歌头.游览》

你已经开始吐槽了吧:这语音效果怎么这么差!

传统的TTS就这样子了,有得听就不错了,如果想要“有感情”的效果那一般要使用成熟的语音合成接口,或者自己训练一个出来。但不管语音效果怎么样,本文的目的已经达到了:怎么用python写一个程序,然后给自己快速地调用到。so,see you。

python应用(2):写个python程序给自己用的更多相关文章

  1. python使用easygui写图形界面程序

    我 们首先下载一个类库easygui,它是一个Python用于简单开发图形化界面的类库,打开easygui的下载网页 http://sourceforge.net/projects/easygui/? ...

  2. 深度学习---手写字体识别程序分析(python)

    我想大部分程序员的第一个程序应该都是“hello world”,在深度学习领域,这个“hello world”程序就是手写字体识别程序. 这次我们详细的分析下手写字体识别程序,从而可以对深度学习建立一 ...

  3. 如何把自己写的python程序给别人用

    这里讲的给别人用,不是指将你的代码开源,也不是指给另一个程序员用..... 前段时间写了个程序,输入URP学生系统的账号和密码,输出课表.绩点之类的信息,想给同学用,但是总不能叫别人也去装python ...

  4. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  5. 写一个python小程序

    在windows环境下进行操作 window+R 输入cmd  创建一个文件夹 mkdir pytxt 创建一个py文件 py.py  用notepad或者记事本等工具进行编辑 或 首先声明pytho ...

  6. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  7. Python入门-函数的使用到程序的公布安装

    Python入门-函数的使用到Python的公布安装 本文主要适合有一定编程经验,至少掌握一门编程语言的人查看. 文中样例大多都是简单到认识英文单词就能看懂的水平,主要讲的是Python的总体使用方法 ...

  8. python入门(7)Python程序的风格

    python入门(7)Python程序的风格 Python采用缩进方式,写出来的代码就像下面的样子: # print absolute value of an integer: a = 100 if ...

  9. python使用paramiko自动化部署linux程序

    使用paramiko模块,比os模块和command模块更加的兼容各种环境.后面两个只能在服务器本机 执行,此模块写得python文件无论是在本地还是服务器本身上运行,都能兼容. paramiko模块 ...

随机推荐

  1. 重新开始记录java教程

    最近在工作上学到了很多的知识和经验,以后每天都来记录给博客园上面

  2. ElasticSearch研究

    前言 ​ ES相关技术文档,很久之前看的,一门技术时间长不去研究就会容易忘了,应有些小伙伴的要求希望我做一期ES技术专栏,我就把以前看过的相关文档整理整理,给大家分享下. 1 ElasticSearc ...

  3. Tensorflow学习笔记No.9

    模型的保存与恢复 介绍一些常见的模型保存与恢复方法,以及如何使用回调函数保存模型. 1.保存完整模型 model.save()方法可以保存完整的模型,包括模型的架构.模型的权重以及优化器. model ...

  4. vue获取路由中的值

    vue中获取路由中的值 在vue中如何获取路由中的值呢?大家先看下面这段代码: this.$route.params && this.$route.params.id 这行代码就是在v ...

  5. 【转】Setting up SDL Extension Libraries on Visual Studio 2010 Ultimate

    FROM:http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/windows ...

  6. ASP.NET Core Authentication系列(一)理解Claim, ClaimsIdentity, ClaimsPrincipal

    前言 首先我们来看一下在ASP.NET时代,Authentication是如何使用的.下面介绍的是System.Web.Security.FormsAuthentication: // 登录 Syst ...

  7. 对Python"一切皆对象"的小参悟

    写在前面 若有误区请大神不吝指正,以免带偏了如我者的弱鸡们 据闻对此不再懵逼后,于函数以及高阶函数编程的进阶有益 类:又称对象,由类创建的个体被称为实例 名言名句"一切皆对象(一切皆类,一切 ...

  8. 记录电子竞技游戏jesp中的传输过程公式

    1.json数据转换成字典 dict1 = json.load(load_f1) dict2 = json.load(load_f2) 2.将两个字典按key排好序,然后使用zip()函数将两个字典对 ...

  9. 不断要求用户输入学生姓名,输入q结束.

    while (true) { Console.WriteLine("请输入学生姓名"); string a = Console.ReadLine(); if (a == " ...

  10. java实现科研信息管理系统

    一.前言 本学期学习了JAVA语言,在学期的结束,写一个有操作界面,与数据库关联的管理系统,用来巩固自己本学习所学的知识.用到的知识:JAVA基础,JAVA界面设计(GUI),Oracle数据库(需要 ...