精华内容
下载资源
问答
  • 私信小编001即可获取大量Python学习资料 图1 本文就将为大家介绍Python中非常实用又风格迥异的两个进度条相关库——tqdm与alive-progress的主要用法。 2 tqdm常用方法 tqdm是Python中所有进度条相关库

    1 简介

    在日常运行程序的过程中常常涉及到**「循环迭代」过程,对于执行时间很短的程序来说倒无所谓,但对于运行过程有明显耗时的涉及「循环迭代」的程序,为其加上「进度条」**(progress bar),是帮助我们监测代码执行进度以及处理中间异常错误非常实用的技巧。

    私信小编001即可获取大量Python学习资料

    图片.png

    图1

    本文就将为大家介绍Python中非常实用又风格迥异的两个进度条相关库——tqdm与alive-progress的主要用法。

    2 tqdm常用方法

    tqdm是Python中所有进度条相关库中最出名的,既然是最出名的,自然有它独到之处。

    tqdm不仅可以生成基础的可在终端中显示的进度条,还可以配合jupyter notebook和jupyter lab生成更加美观的网页**「交互」**部件形式的进度条,更是和pandas强强联手,为pandas中的一些操作提供专有的进度条功能。如果大家对于学习python有任何问题(学习方法,学习效率,如何就业),可以随时来咨询我,这是我的公众号:python教程入门学习(教程/解答/交流群/学习方法/就业信息)都有分享的。

    下面我们来对tqdm的主要功能进行介绍。

    2.1 基础用法

    因为是第三方库,首先需要利用pip install tqdm或 conda install -c conda-forge tqdm对其进行安装,安装完成后先来看看它最基本的用法:

    用 Python 写出这样的进度条,刷新了我对进度条的认知

    图2

    利用tqdm.tqdm,将for循环过程中进行迭代的对象简单包裹,就实现了为循环过程添加进度条以及打印执行速度、已运行时间与预估剩余运行时间等实用信息的功能,同样也可用于**「列表推导」**:

    图片.png

    图3

    而针对迭代对象是range()的情况,tqdm还提供了简化版的trange()来代替tqdm(range()):

    图片.png

    图4

    其附带的参数desc还可以帮助我们设置进度条的说明文字:

    图片.png

    图5

    而如果想要在迭代过程中变更说明文字,还可以预先实例化进度条对象,在需要刷新说明文字的时候执行相应的程序:

    图片.png

    图6

    但当迭代的对象长度一开始未知时,譬如对pandas中的DataFrame.itertuples()进行迭代,我们就只能对其执行速度等信息进行估计,但无法看到进度条递增情况,因为tqdm不清楚迭代的终点如何:这里还是要推荐下小编的Python学习喂鑫*(同音):‘’七六二,四五九,五一零‘’不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2021最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。

    [图片上传失败…(image-70f101-1629533797139)]

    图7

    2.2 配合jupyter notebook/jupyter lab的美观进度条

    tqdm对jupyter notebook和jupyter lab有着特殊的支持,且使用方法非常简单,只需要将原有的from tqdm import XXX的相应功能导入格式修改为from tqdm.notebook import XXX就可以了,以trange为例:

    图片.png

    图8

    2.3 配合pandas中的apply

    tqdm对pandas中的apply()过程提供了特殊的支持,因为pandas中的apply()本质上就是串行循环运算,你可以将pandas中的任何apply操作替换为progress_apply,并且记住每个单独的progress_apply前要先执行tqdm.pandas(),就像下面的例子一样:

    用 Python 写出这样的进度条,刷新了我对进度条的认知

    图9

    3 alive-progress常用方法

    虽然与tqdm一样都是为了给循环过程加上进度条而诞生的库,但alive-progress相比tqdm增加了更多花样繁多的动态效果,我们通过调用其专门提供的showtime()函数可以查看所有可用的动态进度条样式:

    用 Python 写出这样的进度条,刷新了我对进度条的认知

    图10

    同样类似地可以查看所有进度条样式:

    用 Python 写出这样的进度条,刷新了我对进度条的认知

    图11

    使用起来也是非常简单,但与tqdm用法区别很大,需要配合with关键词,譬如下面我们使用到alive_progress中的alive_bar来生成动态进度条:

    用 Python 写出这样的进度条,刷新了我对进度条的认知

    图12

    通过修改bar参数来改变进度条的样式:

    用 Python 写出这样的进度条,刷新了我对进度条的认知

    图13

    更多关于alive-progress的内容感兴趣的朋友可以查看官方说明,但比较遗憾的是目前的alive-progress只能在终端中运行,还没有为jupyter开发更美观的交互式部件,但你可以在譬如网络爬虫等任务中使用它,效果也是很不错的。

    展开全文
  • 用Python写春联:抒写最真诚的祝福和最美好的祈愿

    万次阅读 多人点赞 2020-01-21 11:24:41
    春联是中国传统文化中最具内涵的元素之一,它以对仗工整、简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年的重要习俗。每逢春节期间,无论城市还是农村,家家户户都要精选一副大红...

    1. 前言

    春联是中国传统文化中最具内涵的元素之一,它以对仗工整、简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年的重要习俗。每逢春节期间,无论城市还是农村,家家户户都要精选一副大红春联贴于门上,辞旧迎新,以增加节日的喜庆气氛。据考证,这一习俗起于宋代,盛于明代。有据可查的最早的春联是“三阳始布,四序初开”,始见于莫高窟藏经洞出土的文物中,撰联人为唐人刘丘子,作于开元十一年(公元723年)。
    在这里插入图片描述
    我们这个时代的程序员,大多只是粗通文墨,毛笔字也基本不怎么会写。然而,对于美好生活的向往,那可是一点都不比文人墨客少。借助于代码,我们同样可以写出漂亮的春联,同样可以向家人邻居朋友同事送上我们最真诚的祝福和最美好的祈愿。
    在这里插入图片描述
    下面,我就给大家展示一下,如何用Python写春联,全部代码大约70行。代码中用到的字模均来源于网络,共计1550个常用汉字。如有侵权,我会立即停止服务并删除。

    2. 代码中需要导入的模块

    import io
    from PIL import Image
    import numpy as np
    import requests
    

    3. 下载字模

    def get_word(ch, quality):
        """获取单个汉字(字符)的图片
        ch          - 单个汉字或英文字母(仅支持大写)
        quality     - 单字分辨率,H-640像素,M-480像素,L-320像素
        """
        
        fp = io.BytesIO(requests.post(url='http://xufive.sdysit.com/tk', data={'ch':ch}).content)
        im = Image.open(fp)
        w, h = im.size
        if quality == 'M':
            w, h = int(w*0.75), int(0.75*h)
        elif quality == 'L':
            w, h = int(w*0.5), int(0.5*h)
        
        return im.resize((w,h))
    

    4. 下载龙凤呈祥背景底图

    def get_bg(quality):
        """获取春联背景的图片"""
        
        return get_word('bg', quality)
    

    5. 生成春联

    def write_couplets(text, HorV='V', quality='L', out_file=None):
        """生成春联
        
        text        - 春联内容,以空格断行
        HorV        - H-横排,V-竖排
        quality     - 单字分辨率,H-640像素,M-480像素,L-320像素
        out_file    - 输出文件名
        """
        
        usize = {'H':(640,23), 'M':(480,18), 'L':(320,12)}
        bg_im = get_bg(quality)
        text_list = [list(item) for item in text.split()]
        rows = len(text_list)
        cols = max([len(item) for item in text_list])
        
        if HorV == 'V':
            ow, oh = 40+rows*usize[quality][0]+(rows-1)*10, 40+cols*usize[quality][0]
        else:
            ow, oh = 40+cols*usize[quality][0], 40+rows*usize[quality][0]+(rows-1)*10
        out_im = Image.new('RGBA', (ow, oh), '#f0f0f0')
        
        for row in range(rows):
            if HorV == 'V':
                row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'white')
                offset = (ow-(usize[quality][0]+10)*(row+1)-10, 20)
            else:
                row_im = Image.new('RGBA', (cols*usize[quality][0], usize[quality][0]), 'white')
                offset = (20, 20+(usize[quality][0]+10)*row)
            
            for col, ch in enumerate(text_list[row]):
                if HorV == 'V':
                    pos = (0, col*usize[quality][0])
                else:
                    pos = (col*usize[quality][0],0)
                
                ch_im = get_word(ch, quality)
                row_im.paste(bg_im, pos)
                row_im.paste(ch_im, (pos[0]+usize[quality][1], pos[1]+usize[quality][1]), mask=ch_im)
                
            out_im.paste(row_im, offset)
        
        if out_file:
            out_im.convert('RGB').save(out_file)
        out_im.show()
    

    6. 测试样例

    6.1 普天同庆 欢度春节

    text = '普天同庆 欢度春节'
    write_couplets(text, HorV='V', quality='M', out_file='普天同庆.jpg')
    

    在这里插入图片描述

    6.2 年尽岁除岁月如歌 冬去春来春光似画

    text = '年尽岁除岁月如歌 冬去春来春光似画'
    write_couplets(text, HorV='H', quality='M', out_file='岁月如歌.jpg')
    

    在这里插入图片描述

    6.3 人世间纵有百娇千红 唯独你是我情之所钟

    text = '人世间纵有百娇千红 唯独你是我情之所钟'
    write_couplets(text, HorV='H', quality='M', out_file='情之所钟.jpg')
    

    在这里插入图片描述


    我正在参选2019年CSDN博客之星总评选。既然都读到这里了,就给168号博主天元浪子投上5票吧,谢谢!

    在这里插入图片描述

    展开全文
  • 用Python写一个植物大战僵尸

    万次阅读 多人点赞 2021-01-02 09:58:51
    上次了一个俄罗斯方块,感觉好像大家都看懂了,这次就更新一个植物大战僵尸吧 植物大战僵尸的话 引入需要的模块 import pygame import random 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = ...

    上次写了一个俄罗斯方块,感觉好像大家都看懂了,这次就更新一个植物大战僵尸吧
    植物大战僵尸的话

    引入需要的模块

    import pygame
    import random
    

    配置图片地址

    IMAGE_PATH = 'imgs/'
    

    设置页面宽高

    scrrr_width = 800
    scrrr_height = 560
    

    创建控制游戏结束的状态

    GAMEOVER = False
    

    图片加载报错处理

    LOG = '文件:{}中的方法:{}出错'.format(__file__, __name__)
    

    创建地图类

    class Map():
    

    存储两张不同颜色的图片名称

    map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']
    

    初始化地图

    def __init__(self, x, y, img_index):
        self.image = pygame.image.load(Map.map_names_list[img_index])
        self.position = (x, y)
    

    是否能够种植

    self.can_grow = True
    

    加载地图

    def load_map(self):
        MainGame.window.blit(self.image, self.position)
    

    植物类

    class Plant(pygame.sprite.Sprite):
        def __init__(self):
            super(Plant, self).__init__()
            self.live = True
    

    加载图片

    def load_image(self):
        if hasattr(self, 'image') and hasattr(self, 'rect'):
            MainGame.window.blit(self.image, self.rect)
        else:
            print(LOG)
    

    向日葵类

    class Sunflower(Plant):
        def __init__(self, x, y):
            super(Sunflower, self).__init__()
            self.image = pygame.image.load('imgs/sunflower.png')
            self.rect = self.image.get_rect()
            self.rect.x = x
            self.rect.y = y
            self.price = 50
            self.hp = 100
            # 5 时间计数器
            self.time_count = 0
    

    新增功能:生成阳光

    def produce_money(self):
        self.time_count += 1
        if self.time_count == 25:
            MainGame.money += 5
            self.time_count = 0
    

    向日葵加入到窗口中

    def display_sunflower(self):
        MainGame.window.blit(self.image, self.rect)
    

    豌豆射手类

    class PeaShooter(Plant):
        def __init__(self, x, y):
            super(PeaShooter, self).__init__()
            # self.image 为一个 surface
            self.image = pygame.image.load('imgs/peashooter.png')
            self.rect = self.image.get_rect()
            self.rect.x = x
            self.rect.y = y
            self.price = 50
            self.hp = 200
            # 6 发射计数器
            self.shot_count = 0
    

    增加射击方法

    def shot(self):
        # 6 记录是否应该射击
        should_fire = False
        for zombie in MainGame.zombie_list:
            if zombie.rect.y == self.rect.y and zombie.rect.x < 800 and zombie.rect.x > self.rect.x:
                should_fire = True
        # 6 如果活着
        if self.live and should_fire:
            self.shot_count += 1
            # 6 计数器到25发射一次
            if self.shot_count == 25:
                # 6 基于当前豌豆射手的位置,创建子弹
                peabullet = PeaBullet(self)
                # 6 将子弹存储到子弹列表中
                MainGame.peabullet_list.append(peabullet)
                self.shot_count = 0
    

    将豌豆射手加入到窗口中的方法

    def display_peashooter(self):
        MainGame.window.blit(self.image, self.rect)
    

    豌豆子弹类

    class PeaBullet(pygame.sprite.Sprite):
        def __init__(self, peashooter):
            self.live = True
            self.image = pygame.image.load('imgs/peabullet.png')
            self.damage = 50
            self.speed = 10
            self.rect = self.image.get_rect()
            self.rect.x = peashooter.rect.x + 60
            self.rect.y = peashooter.rect.y + 15
    
        def move_bullet(self):
            # 7 在屏幕范围内,实现往右移动
            if self.rect.x < scrrr_width:
                self.rect.x += self.speed
            else:
                self.live = False
    
        # 7 新增,子弹与僵尸的碰撞
        def hit_zombie(self):
            for zombie in MainGame.zombie_list:
                if pygame.sprite.collide_rect(self, zombie):
                    # 打中僵尸之后,修改子弹的状态,
                    self.live = False
                    # 僵尸掉血
                    zombie.hp -= self.damage
                    if zombie.hp <= 0:
                        zombie.live = False
                        self.nextLevel()
        # 7闯关方法
    
        def nextLevel(self):
            MainGame.score += 20
            MainGame.remnant_score -= 20
            for i in range(1, 100):
                if MainGame.score == 100 * i and MainGame.remnant_score == 0:
                    MainGame.remnant_score = 100 * i
                    MainGame.shaoguan += 1
                    MainGame.produce_zombie += 50
    
        def display_peabullet(self):
            MainGame.window.blit(self.image, self.rect)
    

    僵尸类

    class Zombie(pygame.sprite.Sprite):
        def __init__(self, x, y):
            super(Zombie, self).__init__()
            self.image = pygame.image.load('imgs/zombie.png')
            self.rect = self.image.get_rect()
            self.rect.x = x
            self.rect.y = y
            self.hp = 1000
            self.damage = 2
            self.speed = 1
            self.live = True
            self.stop = False
        # 9 僵尸的移动
    
        def move_zombie(self):
            if self.live and not self.stop:
                self.rect.x -= self.speed
                if self.rect.x < -80:
                    # 8 调用游戏结束方法
                    MainGame().gameOver()
    
        # 9 判断僵尸是否碰撞到植物,如果碰撞,调用攻击植物的方法
        def hit_plant(self):
            for plant in MainGame.plants_list:
                if pygame.sprite.collide_rect(self, plant):
                    # 8  僵尸移动状态的修改
                    self.stop = True
                    self.eat_plant(plant)
        # 9 僵尸攻击植物
    
        def eat_plant(self, plant):
            # 9 植物生命值减少
            plant.hp -= self.damage
            # 9 植物死亡后的状态修改,以及地图状态的修改
            if plant.hp <= 0:
                a = plant.rect.y // 80 - 1
                b = plant.rect.x // 80
                map = MainGame.map_list[a][b]
                map.can_grow = True
                plant.live = False
                # 8 修改僵尸的移动状态
                self.stop = False
    
        # 9 将僵尸加载到地图中
    
        def display_zombie(self):
            MainGame.window.blit(self.image, self.rect)
    

    主程序

    class MainGame():
        # 2 创建关数,得分,剩余分数,钱数
        shaoguan = 1
        score = 0
        remnant_score = 100
        money = 200
        # 3 存储所有地图坐标点
        map_points_list = []
        # 3 存储所有的地图块
        map_list = []
        # 4 存储所有植物的列表
        plants_list = []
        # 7 存储所有豌豆子弹的列表
        peabullet_list = []
        # 9 新增存储所有僵尸的列表
        zombie_list = []
        count_zombie = 0
        produce_zombie = 100
        # 1 加载游戏窗口
    
        def init_window(self):
            # 1 调用显示模块的初始化
            pygame.display.init()
            # 1 创建窗口
            MainGame.window = pygame.display.set_mode([scrrr_width, scrrr_height])
    
        # 2 文本绘制
        def draw_text(self, content, size, color):
            pygame.font.init()
            font = pygame.font.SysFont('kaiti', size)
            text = font.render(content, True, color)
            return text
    
        # 2 加载帮助提示
        def load_help_text(self):
            text1 = self.draw_text('1.按左键创建向日葵 2.按右键创建豌豆射手', 26, (255, 0, 0))
            MainGame.window.blit(text1, (5, 5))
    
        # 3 初始化坐标点
        def init_plant_points(self):
            for y in range(1, 7):
                points = []
                for x in range(10):
                    point = (x, y)
                    points.append(point)
                MainGame.map_points_list.append(points)
                print("MainGame.map_points_list", MainGame.map_points_list)
    
        # 3 初始化地图
        def init_map(self):
            for points in MainGame.map_points_list:
                temp_map_list = list()
                for point in points:
                    # map = None
                    if (point[0] + point[1]) % 2 == 0:
                        map = Map(point[0] * 80, point[1] * 80, 0)
                    else:
                        map = Map(point[0] * 80, point[1] * 80, 1)
                    # 将地图块加入到窗口中
                    temp_map_list.append(map)
                    print("temp_map_list", temp_map_list)
                MainGame.map_list.append(temp_map_list)
            print("MainGame.map_list", MainGame.map_list)
    
        # 3 将地图加载到窗口中
        def load_map(self):
            for temp_map_list in MainGame.map_list:
                for map in temp_map_list:
                    map.load_map()
    
        # 6 增加豌豆射手发射处理
        def load_plants(self):
            for plant in MainGame.plants_list:
                # 6 优化加载植物的处理逻辑
                if plant.live:
                    if isinstance(plant, Sunflower):
                        plant.display_sunflower()
                        plant.produce_money()
                    elif isinstance(plant, PeaShooter):
                        plant.display_peashooter()
                        plant.shot()
                else:
                    MainGame.plants_list.remove(plant)
    
        # 7 加载所有子弹的方法
        def load_peabullets(self):
            for b in MainGame.peabullet_list:
                if b.live:
                    b.display_peabullet()
                    b.move_bullet()
                    # v1.9 调用子弹是否打中僵尸的方法
                    b.hit_zombie()
                else:
                    MainGame.peabullet_list.remove(b)
    
        # 8事件处理
    
        def deal_events(self):
            # 8 获取所有事件
            eventList = pygame.event.get()
            # 8 遍历事件列表,判断
            for e in eventList:
                if e.type == pygame.QUIT:
                    self.gameOver()
                elif e.type == pygame.MOUSEBUTTONDOWN:
                    # print('按下鼠标按键')
                    print(e.pos)
                    # print(e.button)#左键1  按下滚轮2 上转滚轮为4 下转滚轮为5  右键 3
    
                    x = e.pos[0] // 80
                    y = e.pos[1] // 80
                    print(x, y)
                    map = MainGame.map_list[y - 1][x]
                    print(map.position)
                    # 8 增加创建时候的地图装填判断以及金钱判断
                    if e.button == 1:
                        if map.can_grow and MainGame.money >= 50:
                            sunflower = Sunflower(map.position[0], map.position[1])
                            MainGame.plants_list.append(sunflower)
                            print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))
                            map.can_grow = False
                            MainGame.money -= 50
                    elif e.button == 3:
                        if map.can_grow and MainGame.money >= 50:
                            peashooter = PeaShooter(
                                map.position[0], map.position[1])
                            MainGame.plants_list.append(peashooter)
                            print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))
                            map.can_grow = False
                            MainGame.money -= 50
    
        # 9 新增初始化僵尸的方法
        def init_zombies(self):
            for i in range(1, 7):
                dis = random.randint(1, 5) * 200
                zombie = Zombie(800 + dis, i * 80)
                MainGame.zombie_list.append(zombie)
    
        # 9将所有僵尸加载到地图中
        def load_zombies(self):
            for zombie in MainGame.zombie_list:
                if zombie.live:
                    zombie.display_zombie()
                    zombie.move_zombie()
                    # v2.0 调用是否碰撞到植物的方法
                    zombie.hit_plant()
                else:
                    MainGame.zombie_list.remove(zombie)
        # 1 开始游戏
    
        def start_game(self):
            # 1 初始化窗口
            self.init_window()
            # 3 初始化坐标和地图
            self.init_plant_points()
            self.init_map()
            # 9 调用初始化僵尸的方法
            self.init_zombies()
            # 1 只要游戏没结束,就一直循环
            while not GAMEOVER:
                # 1 渲染白色背景
                MainGame.window.fill((255, 255, 255))
                # 2 渲染的文字和坐标位置
                MainGame.window.blit(
                    self.draw_text(
                        '当前钱数$: {}'.format(
                            MainGame.money), 26, (255, 0, 0)), (500, 40))
                MainGame.window.blit(
                    self.draw_text(
                        '当前关数{},得分{},距离下关还差{}分'.format(
                            MainGame.shaoguan,
                            MainGame.score,
                            MainGame.remnant_score),
                        26,
                        (255,
                         0,
                         0)),
                    (5,
                     40))
                self.load_help_text()
    
                # 3 需要反复加载地图
                self.load_map()
                # 6 调用加载植物的方法
                self.load_plants()
                # 7  调用加载所有子弹的方法
                self.load_peabullets()
                # 8 调用事件处理的方法
                self.deal_events()
                # 9 调用展示僵尸的方法
                self.load_zombies()
                # 9 计数器增长,每数到100,调用初始化僵尸的方法
                MainGame.count_zombie += 1
                if MainGame.count_zombie == MainGame.produce_zombie:
                    self.init_zombies()
                    MainGame.count_zombie = 0
                pygame.time.wait(10)
                pygame.display.update()
    
        def gameOver(self):
            MainGame.window.blit(
                self.draw_text(
                    '游戏结束', 50, (255, 0, 0)), (300, 200))
            print('游戏结束')
            pygame.time.wait(400)
            global GAMEOVER
            GAMEOVER = True
    
    
    if __name__ == '__main__':
        game = MainGame()
        game.start_game()
    

    在这里插入图片描述
    写完的效果就是这样啦

    展开全文
  • 用Python写一个语音播放软件

    千次阅读 多人点赞 2018-11-11 15:40:22
    Python这么久不如动手一款自己的语音广播软件,即使发生故障也可以自行排除。   1 界面设计   在开始动工之前当然要分析需求,我要的核心功能是将一段文字通知输入软件,然后将其转换为语音并播放出来。....

    单位经常使用广播进行临时事项的通知(将文字转换为语音然后通过功放广播),但是市面上多数语音播放软件都是收费的,要么发音失真,要么不够稳定——经常出现莫名其妙的故障,容易给工作带来被动。学Python这么久不如动手写一款自己的语音广播软件,即使发生故障也可以自行排除。

     

    1

    界面设计

     

    在开始动工之前当然要分析需求,我要的核心功能是将一段文字通知输入软件,然后将其转换为语音并播放出来。

    这项功能虽然并不复杂,但也需要一个交互式的界面,所以决定使用Tkinter来实现这个功能。

     

    第一步:建立一个窗体

    设置标题、大小等要素,为了避免显示格式错乱将其设定为不可改变大小,代码如下:

     

    第二步,设置一个控件

    用于接受收入的文字,这里选择带滚动条的Text,代码如下:

     

    第三步,提供选项

    作为一款语音播放软件,最基本的语速、音调等风格设置还是要有的,这里使用Combobox控件提供固定选项,用户可以根据情况选择不同的发音、语速和语调。

     

    第四步,建立功能事件的触发接口

    设置三个Button控件分别用于触发“语音播放”、“文本清除”和“界面退出”功能。

     

    最终界面效果如下:

     

    2

    语音播放

     

    关于“清除”、“退出”等功能相对比较简单,这里重点对本次的核心功能——语音播放进行详细说明。

     

    1).语音接口
    文本转换语音推荐使用百度云的REST API 接口,登录网站http://ai.baidu.com/,依次进入控制台——语音技术页面,创建自己的语音应用(下图),其中AppID 、API Key 、Secret Key 三个参数在代码中会用到。

     

    然后使用 pip install baidu-aip 安装python SDK模块,我们来看一下函数原型:

    APP_ID = 'XXXXXX'
    API_KEY = 'XXXXXXXXXXXXX'
    SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXX'
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    result  = client.synthesis(text, 'zh', 1, {'per':1, 'vol':15, 'pit':9, 'spd':5 })
    • text:需要转换的文字。

    • per:发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声。vol:音量,取值0-15,默认为5中音量

    • pit:音调,取值0-9,默认为5中语调。

    • spd:语速,取值0-9,默认为5中语速。‘zh’和1分别为语音模式和客户端类型,该两项均为固定值,不支持修改。

    可以看到,我们需要的发音、音调、语速三种风格都可以通过修改参数来实现。

     

    2).功能设计

    解决了语音合成接口的问题,就可以结合界面设置来实现具体功能了。

    • 首先,要将界面中的语音风格选项与语音合成函数参数一一对应起来,这是一个典型的键与值的对应关系,使用字典这种数据结构再合适不过了。

    • 然后对于发音风格,选取了男声、女声、混合三种模式;

    • 最后对于音调和语速,没必要设置过细的精度等级,这里分别选取了三个跨度明显的等级进行区分。

     

    当“播放”按钮点击时,要从Text控件中读取文本,如果文本为空则弹出提示框要求重新输入;若文本不为空则将文本转换为音频文件并使用playsound进行播放。

    这里有一个问题需要特别注意,那就是在软件运行过程中,生成并播放的音频文件不可删除、不可修改、不可覆盖,所以每次转换生成的音频文件名称绝对不能重复,否则在进行多次“播放”操作时,会因为新生成的音频文件无法保存而发生故障。

     

    3

    打包封装

    到目前为止,这个软件的运行要依赖于本地的python开发环境,不能方便地提供给他人使用,这里推荐Pyinstaller的第三方库来对python程序进行打包,首先进入刚才的py文件所在目录,执 行以下cmd命令。其中“-w”的作用是是不显示命令窗口,tk_voice是刚才的py文件名称。

    pyinstaller -w tk_voice.py

    这时,在同一目录下会生成一个dist文件夹,这里面就是打包后的程序文件了。我们运行一下其中的.exe文件,就会出现之前设计的程序界面,在文本框中输入一段测试文字:“全体人员请注意,全体人员请注意,请立即下楼集合开饭。”,点击“播放”按钮试一下效果:

    插入音频————测试.mp3

    最后,关于Pyinstaller的使用有几点需要注意的地方:

    • 该方法仅适用于windows系统,而且对系统版本有比较严格的要求,比如64位系统下打包的程序无法在32位系统下运行。

    • 如果需要打包的程序中调用了外部的一些图片或其他资源文件,则需要手动复制到打包后的文件夹内,因为对于这些文件Pyinstaller不会进行打包。

    • 使用Pyinstaller打包如果出现中途失败的情况,可能会导致原py文件内容丢失,所以打包之前最好先进行备份。

    • 使用import导入其他库的时候尽量有选择性,不要导入整个库,不然打包后的文件会非常庞大。

     

    本文使用python写了一款语音播放软件,主要涉及Tkinter、baidu-aip、playsound、pyinstaller几个库,能够实现基本的语音合成及播放功能,能够脱离python开发环境运行,便于自行维护和扩展,缺点是界面比较简陋、功能比较单一,有兴趣的小伙伴可以自行修改完善。

    展开全文
  • 如何用Python写一个安卓APP

    万次阅读 多人点赞 2018-04-11 19:23:56
    前言:用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择,而且实在不想学习Java,再者,就编程而言已经会的就Python与Golang(注:Python,Golang水平都一般),那么久Google了一下Python写安卓的APP...
  • 如何用python写游戏脚本?

    千次阅读 2020-08-17 13:43:08
    前言 最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以...当然,作为一名程序员,肝这种东西完全可以用写代码的方式帮我们自动完成。游戏脚本其实并不高深,最简
  • python写一个自动识别图片提取文字

    千次阅读 2020-10-07 20:58:03
    python写一个自动识别图片提取文字。 ** 1.介绍 使用python写一个自动识别图片提取文字的exe. 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情。 准备工作 import keyboard #安装: ...
  • Python 一个安卓 APP

    千次阅读 2019-08-13 17:11:00
    作者:youerninghttp://youerning.blog.51cto.com/10513771/1733534前言 Python 安卓 APP 肯定不是最好...
  • 原标题:用Python写一个嫦娥奔月,中秋快乐月是故乡明,每到中秋佳节,很多在外打工的码农因为工作不一定能回家团圆。今时今日不知有多少人为了生计、为了事业、为了理想远走他乡,在一座陌生的城市中寻求一席之地,...
  • 如何用python写文本

    2019-08-24 17:00:54
    Python写文件: (在此我了自己的一个文件) 有2种模式: 第一种:write() txt.write("Hello!") 第二种:print() (注意print会把所有输入都变成UTF-8字符串) py2: print >> txt, “Hello”...
  • 用Python写的表白小程序

    千次阅读 2019-09-17 23:08:37
    利用Python中的tkinter 的 图形化界面编程可以用来制作一些好玩的小程序,但是前提是要有tkinter这个包。 在Windows下安装,直接在dos窗口中输入 pip install tkinter 做完准备工作之后,我们就可以来进入创作了...
  • 【kimol君的无聊小发明】—用python写音乐下载器

    千次阅读 多人点赞 2020-10-08 01:51:25
    【kimol君的无聊小发明】—用python写音乐下载器前言一、技术实现1.前人栽树后人乘凉2.后来者居上3.集大成者二、后续改进写在最后 Tip:本文仅供学习与交流,切勿用于非法用途!!! 前言 某个夜深人静的夜晚,我...
  • 用python写一个图形界面!

    千次阅读 2019-10-25 22:06:13
    作为Pyhan开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列几种我认识的 1.tkinter Tkinter(也叫Tk接口)...
  • 用Python写一个图片标注工具

    千次阅读 2018-12-27 16:57:30
    $ sudo apt intall python-tk # PIL (Python Image Library) $ sudo apt-get install python-imaging # 上面的命令如果不行的话 $ sudo apt-get install python-pil # 需要安装python-imaging-tk $ sudo apt inst....
  • pygame开发了一个迷宫小游戏,完整源码哦
  • 如何Python Web 应用?

    千次阅读 多人点赞 2020-01-20 14:45:52
    王树义读完需要16分钟速读仅需 6 分钟不用学前端编程,你就能 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户。1 痛点从我开始折腾数...
  • 打开后弹框 ,输入整数,进行秒倒计时 点击查看作者原文
  • 用python写一个简单的词法分析器

    千次阅读 2018-12-22 03:53:52
    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个。 目标 能识别变量,数字,运算符,界符和关键字,excel表打印出来。 有了目标,想想要怎么实现词法分析器。 1.先进行预处理,把注释,...
  • 最近利用业余时间体验了下python语言,并了个爬虫爬取我csdn上关注的几个大神的博客,然后利用leancloud一站式后端云服务器存储数据,再了一个android app展示数据,也算小试了一下这门语言,给我的感觉就是,像...
  • 前言最近在玩儿公主连结,之前也玩儿过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。...当然,本篇文章不是要讲Airtest这个怎么,而是原始的python+opencv来实...
  • python图片中文字识别

    千次阅读 2020-10-12 15:25:42
    一、前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常...Tesseract是一个用于文字识别的工具,我们结合Python使用可以很快的实现文字识别。但是在此之前我们需要完成一个繁
  • 原标题:30分钟学会用Python编写简单程序参与文末每日话题讨论,赠送异步新书异步图书君 学习目标知道有序的软件开发过程的步骤。了解遵循输入、处理、输出(IPO)模式的程序,并能够以简单的方式修改它们。了解构成...
  • 书由奋战在Python开发一线近20年的Luciano Ramalho执笔,Victor Stinner、Alex Martelli等Python大咖担纲技术审稿人,从语言设计层面剖析编程细节,兼顾Python 3和Python 2,告诉你...教你写出风格地道的Python代码。
  • 本文将给大家分享一个实用的Python办公自动化脚本「利用Python批量翻译英文Word文档并保留格式」,最终效果甚至比部分收费的软件还要好!先来看看具体的工作内容。 一、需求描述 手上有大量外文文档(本案例以5...
  • 用Python语言个科学计算器

    千次阅读 多人点赞 2019-07-22 16:43:35
    自学Python语言一个月,还是小白,发一个科学计算器的代码,希望大家批评指正,共勉嘛。 calculator.py from tkinter import * from functools import partial from calculate import * # 生成计算器主界面 def ...
  • 用Python提取图片&截图中的文字

    千次阅读 多人点赞 2019-12-31 00:40:10
    用Python“破解”某度文库等文库复制的限制》 tips:当个标题党真刺激啊 开发背景 临近期末,CYQ要许多作业。迫不得已寻找度娘解决问题,找到之后,CYQ习惯性地ctrl+c,当ctrl+v时发现,emmm!?没有啊!仔细一...
  • 如何 Python 一个安卓 APP ?

    千次阅读 2019-08-12 13:26:13
    Python 安卓 APP 肯定不是最好的选择,目前Java和 kotlin 的居多,但是肯定也是一个很偷懒的选择,而且实在不想学习 Java,再者,就编程而言已经会的就 Python与Golang(注:Python,Golang水平都一般),...
  • 本文最后给了打包好的软件,无需安装Python环境和各种依赖,直接下载软件,解压后,双击exe文件即可使用。先来看一下具体的效果。运行程序。 点击「选择图片」 选择JPG/JPGE/PNG三种中任意一种格式的图片,然后...
  • 如何用Python写一个小游戏(1)

    千次阅读 2016-12-08 13:42:34
    =============================================================第一版:打飞机文字版 思路: 1:主飞机从底层y = 1生成,左右移动 ,每次左右x轴随机移动n个位置,并且移送过的地方每一个位置都会生成一个子弹,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,212
精华内容 26,484
关键字:

如何用python写出文字

python 订阅