python应用(2):写个python程序给自己用
用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程序给自己用的更多相关文章
- python使用easygui写图形界面程序
我 们首先下载一个类库easygui,它是一个Python用于简单开发图形化界面的类库,打开easygui的下载网页 http://sourceforge.net/projects/easygui/? ...
- 深度学习---手写字体识别程序分析(python)
我想大部分程序员的第一个程序应该都是“hello world”,在深度学习领域,这个“hello world”程序就是手写字体识别程序. 这次我们详细的分析下手写字体识别程序,从而可以对深度学习建立一 ...
- 如何把自己写的python程序给别人用
这里讲的给别人用,不是指将你的代码开源,也不是指给另一个程序员用..... 前段时间写了个程序,输入URP学生系统的账号和密码,输出课表.绩点之类的信息,想给同学用,但是总不能叫别人也去装python ...
- 利用Python写一个抽奖程序,解密游戏内抽奖的秘密
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- 写一个python小程序
在windows环境下进行操作 window+R 输入cmd 创建一个文件夹 mkdir pytxt 创建一个py文件 py.py 用notepad或者记事本等工具进行编辑 或 首先声明pytho ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Python入门-函数的使用到程序的公布安装
Python入门-函数的使用到Python的公布安装 本文主要适合有一定编程经验,至少掌握一门编程语言的人查看. 文中样例大多都是简单到认识英文单词就能看懂的水平,主要讲的是Python的总体使用方法 ...
- python入门(7)Python程序的风格
python入门(7)Python程序的风格 Python采用缩进方式,写出来的代码就像下面的样子: # print absolute value of an integer: a = 100 if ...
- python使用paramiko自动化部署linux程序
使用paramiko模块,比os模块和command模块更加的兼容各种环境.后面两个只能在服务器本机 执行,此模块写得python文件无论是在本地还是服务器本身上运行,都能兼容. paramiko模块 ...
随机推荐
- 使用js模拟点击,点击a链接 $("#abc ").click(); 无效的解决方案
摘要: 问题分析 点击A标签本身,并不会触发跳转到指定链接的事件,就是说,我们平时都是点击的A标签中的文字了. 所以要想用JS模拟点击A标签事件,就得先往A标签中的文字添加能被JS捕获的元素,然后再用 ...
- python接口自动化测试--批量读取数据
为了便于维护,python接口自动化测试用例可以利用xlrd模块读取excal表格进行数据分离.我们可以利用xlrd模块的row_values()和cell_value()两种方法读取Excal表格. ...
- Java学习的第二十六天
1.过滤处理流 DataOutputStream输入数据 用DataInputStream读数据 2.方法太多记不清 3.明天学习内存操作流和缓冲流
- springboot + post 中文乱码
去检查你的 filter 配置,是否配置了一个最高优先级的 filter, 这个最高优先级的 filter 会影响 springboot 自动配置的 CharacterEncodingFilter.原 ...
- 分布式文档存储数据库之MongoDB基础入门
一.MongoDB简介 MongoDB是用c++语言开发的一款易扩展,易伸缩,高性能,开源的,schema free 的基于文档的nosql数据库:所谓nosql是指不仅仅是sql的意思,它拥有部分s ...
- 3.6 栈 ADT - 3.7 队列 ADT
3.6 栈 ADT 栈是限制插入和删除只能在一个位置上进行的表,叫做栈的顶部.对栈的基本操作有进栈和出栈,进栈在顶部插入元素,出栈删除最后插入的元素. 栈是一个表,因此任何实现表的方法都能实现栈.显然 ...
- Ubuntu17.10 React Native 环境搭建
React Native 环境搭建 环境:ubuntu17.10 安装依赖 必须安装的依赖有:Node.React Native 命令行工具以及 JDK 和 Andriod Studio. 安装nod ...
- layui的laypage实现分页/查询
最开始我的数据绑定使用的razor语法来绑定的 就像下面这样 @if (ViewBag.listBlog != null) { foreach (var item in ViewBag.listBlo ...
- 什么是麒麟(kylin)?查数据贼快的哟
前言 微信搜[Java3y]关注这个有梦想的男人,点赞关注是对我最大的支持! 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文 ...
- 使用邮箱验证登录后台ssh,再也不怕被人攻击服务器了!
目录 前言 安装教程 前言 之前写过使用用户名密码,以及扫描二维码方式验证后台登录ssh的文章:[点击跳转]. 但是这样还是不太保险,也存在被人利用的情况,因为别人破解你的后台你压根不知道.因此想到使 ...