Kivy 项目51斩百词 6 播放读音

news2024/9/24 7:14:21

为了给小喇叭图像绑定点击事件,实现当用户点击按钮时,触发该事件对应的回调方法。

在方法内对于不同的系统Kivy使用不同的播放语音方法,

对于Windows系统      使用SoundLoader播放语音,

对于其他的Unix系统   使用Pyjnjus播放(Windows安装不太方便,打包时添加即可)

打包不同的系统时 用不同的代码,而不是一蹴而就。

def play_word(self):

 def play_word(self):
        """播放MP3文件"""
        word = self.ids.word_to_study.text
        storage_path = 'mp3/%s.mp3' % word
        if os.name == 'nt':
            self.window_play_word(storage_path)
        elif os.name == 'posix':
            self.unix_play_word(storage_path)

    @staticmethod
    def window_play_word(storage_path):
        from kivy.core.audio import SoundLoader
        sound = SoundLoader.load(storage_path)
        sound.play()

    @staticmethod
    def unix_play_word(storage_path):
        # 安装Pyjnius
        from jnius import autoclass
        MediaPlayer = autoclass('android.media.MediaPlayer')
        player = MediaPlayer()
        if player.isPlaying():
            player.stop()
            player.reset()
        try:
            player.setDataSource(storage_path)
            player.prepare()
            player.start()
        except:
            player.reset()
os.name

os.name 是 Python 的 os 模块中的一个属性,它返回一个字符串,指示正在使用的操作系统。这个属性对于编写跨平台代码时判断操作系统类型非常有用。

os.name 的返回值可能包括以下几种:

  • 'posix': 表示 Unix-like 的操作系统,如 Linux, macOS(以前的 OS X), BSD, AIX 等。
  • 'nt': 表示 Windows 操作系统。
  • 'os2': 表示 OS/2 操作系统。
  • 'ce': 表示 Windows CE。
  • 'java': 表示 Java 虚拟机(JVM)。
  • 'riscos': 表示 RISC OS。

但需要注意的是,os.name 主要用于标识操作系统的类型,而不是具体的操作系统版本或发行版。

在编写跨平台代码时,你可以使用 os.name 来确定使用哪种方法或库来执行特定于操作系统的任务。但是,当可能的话,最好使用跨平台的库和工具,以减少对不同操作系统的特殊处理。

例如:

import os  
  
if os.name == 'posix':  
    # Unix-like 系统代码  
    print("Running on a Unix-like system")  
elif os.name == 'nt':  
    # Windows 系统代码  
    print("Running on Windows")  
else:  
    # 其他系统代码  
    print("Running on an unknown system")

但是,对于音频播放这样的功能,通常可以使用跨平台的库(如 PyDub, soundfile, Kivy 的 SoundLoader 等),从而避免使用 os.name 来判断操作系统类型。

kivy.core.audio import SoundLoader

Audio — Kivy 2.3.0 documentation

from injus import autoclass
jnius 

jnius 是一个 Python 库,它允许你在 Python 代码Kivy on Android — Kivy 2.3.0 documentation中与 Java 类进行交互,特别是在 Kivy 框架的 Android 应用中。jnius 提供了对 Java Native Interface (JNI) 的封装,使得 Python 开发者能够轻松地访问 Java 类库和 Android API。

在 Kivy 应用程序中,jnius 特别有用,因为 Kivy 支持跨平台开发,但某些特定于 Android 的功能可能需要使用 Java 代码来实现。通过使用 jnius,你可以直接在 Python 代码中调用这些 Java 类和方法,而无需编写额外的 Java 代码或绑定库。

以下是使用 jnius 的一些基本步骤:

  1. 安装:如果你正在使用 Kivy 进行 Android 开发,jnius 通常已经作为 Kivy 的一部分包含在内。但如果你需要单独安装它,可以通过 pip 进行安装。
  2. 导入:在你的 Python 代码中,你可以使用 from jnius import autoclass 来导入你想要的 Java 类。autoclass 会动态地加载指定的 Java 类。
  3. 使用:一旦你导入了 Java 类,你就可以像使用 Python 类一样使用它们。例如,你可以创建类的实例、调用方法、访问属性等。

下面是一个简单的示例,演示如何使用 jnius 来访问 Android 的 Toast 类并显示一条消息:

from jnius import autoclass  
  
def show_toast(text):  
    Toast = autoclass('android.widget.Toast')  
    toast = Toast.makeText(android.getApplicationContext(), text, Toast.LENGTH_SHORT)  
    toast.show()  
  
# 在某个地方调用这个函数  
show_toast("Hello from Python!")

请注意,这个示例假设你正在一个 Android 环境中运行(比如一个 Kivy 应用),并且已经有了对 android 模块的引用(这个模块在 Kivy 的 Android 环境中是可用的)。

总之,jnius 是一个强大的工具,它允许 Python 开发者在 Android 应用中轻松地使用 Java 类和库。

Kivy on Android — Kivy 2.3.0 documentation

def read_random_word(self):

    def read_random_word(self):
        """随机读取一条数据"""
        sql = "SELECT * FROM word WHERE id = (SELECT word_id FROM today ORDER BY RANDOM() limit 1)"
        rows = select_data(sql)
        if len(rows) == 0:
            # 先清除所有widgets
            pass
        else:
            # 清除存在的三个按钮和标签
            self.ids.main_box.clear_widgets(children=[self.ids.three_labels_box, self.ids.box_button_anchor])
            # 绑定点击任意位置执行方法
            self.ids.main_box.bind(on_touch_down=self.anywhere_touch_down)
            self.ids.word_to_study.text = rows[0][1]
            self.ids.phonetic.text = rows[0][3]
.clear_widgets()

.clear_widgets() 并不是所有GUI库都内置的一个通用方法。然而,这个方法在Kivy的BoxLayoutGridLayoutStackLayout等布局类中是一个常见的方法,用于清除布局中的所有子部件(widgets)。

例如,在Kivy中,如果你有一个BoxLayout,并且你想清除其中的所有子部件。

点击屏幕任意一点实现点击效果:

def anywhere_touch_down():

 def anywhere_touch_down(self, instance, args):
        """单击任意位置都会执行这个方法"""
        print("info.py anywhere_touch_down is running")
        self.ids.main_box.unbind(on_touch_down=self.anywhere_touch_down)
        self.play_word()
        self.show_detail_word()

def read_random_word(self):

    def read_random_word(self):
        """随机读取一条数据"""
        sql = "SELECT * FROM word WHERE id = (SELECT word_id FROM today ORDER BY RANDOM() limit 1)"
        rows = select_data(sql)
        if len(rows) == 0:
            # 先清除所有widgets
            pass
        else:
            # 清除存在的三个按钮和标签
            self.ids.main_box.clear_widgets(children=[self.ids.three_labels_box, self.ids.box_button_anchor])
            # 绑定点击任意位置执行方法
            self.ids.main_box.bind(on_touch_down=self.anywhere_touch_down)
            self.ids.word_to_study.text = rows[0][1]
            self.ids.phonetic.text = rows[0][3]
个人总结分析:                                                                                                                                  两函数之间关系互动维妙维俏,运维顺畅,若流水入明渠,融会贯通。                     

部分布局及其组件隐藏

展示   def show_detail_word(self):

    def show_detail_word(self):
        """显示被隐藏的部分"""
        word = self.ids.word_to_study.text
        sql = "SELECT * FROM word WHERE word = '%s'" % word
        rows = select_data(sql)
        self.ids.main_box.clear_widgets(children=[self.ids.box_button_anchor, self.ids.three_labels_box])
        self.ids.main_box.add_widget(self.ids.three_labels_box)
        self.ids.main_box.add_widget(self.ids.box_button_anchor)

        from MRWord.utils.common import sub_str_len
        self.ids.word_to_study.text = rows[0][1]
        self.ids.explain_word.text = sub_str_len(rows[0][2].strip(), 3)
        self.ids.phonetic.text = rows[0][3]
        self.ids.examples_en.text = rows[0][4]
        self.ids.examples_cn.text = rows[0][5]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1701550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PawSQL: 企业级SQL审核工具的新玩家

随着数据库应用在企业中的广泛使用,确保SQL代码质量的重要性日益凸显。现有的SQL审核工具很多,包括Yearning、goInception、Bytebase、爱可生的SQLE、云和恩墨的SQM等等,但是它们或者规则覆盖度、或者是在正确率等方面存在明显不足&#xff1…

Halo Theme AirCloud 主题文档

发现一款简洁的halo主题 Halo Theme AirCloud 主题文档 | LogDicthttps://www.logdict.com/archives/AirCloud

2-Django项目进阶--继续学生管理系统

目录 项目框架: urls.py views.py modules.py class_data.html add_and_modify.html add_stu.html 笔记: 继承语法 模板继承总结: 班级添加 add_and_modify.html 修改添加公用一个页面即可 views.py 班级修改 views.py url.py 班级删除 views.py…

牛客热题:寻找第K大

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:寻找第K大题目链接方法一&#…

面试官:讲讲为什么SpringBoot的 jar 可以直接运行?

Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它通过约定优于配置和大量的自动化配置,使得开发者可以更轻松地创建和部署 Spring 应用程序。一个特别引人注目的特性是 Spring Boot 应用可以打包成一个可执行的 JAR 文件,并且可以直…

基于图鸟UI的圈子商圈:一个全栈前端模板的探索与应用

摘要: 本文介绍了一个基于图鸟UI的纯前端模板——圈子商圈,它支持微信小程序、APP和H5等多平台开发。该模板不仅包含丰富的UI组件和页面模板,还提供了详尽的使用文档,旨在帮助开发者快速构建出酷炫且功能齐全的前端应用。本文将从…

51-54 Sora能制作动作大片还需要一段时间 | DrivingGaussian:周围动态自动驾驶场景的复合高斯飞溅

24年3月,北大、谷歌和加州大学共同发布了DrivingGaussian: Composite Gaussian Splatting for Surrounding Dynamic Autonomous Driving Scenes。视图合成和可控模拟可以生成自动驾驶的极端场景Corner Case,这些安全关键情况有助于以更低成本验证和增强自…

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车,如何编写串口通信指令 第14章-手机遥控功能 我们要实现蓝牙遥控功能,蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块 所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调 14.1-电脑控制小车 完成功能…

乐游巴蜀,V你而来!苏州金龙海格新V系很“巴适”

成都,自古有“天府之国”之美誉,古老的城市人文与现代的摩登活力相交相融,加之令人垂涎的美食文化,共同造就了这里超强的旅游吸引力。2024年5月23日,以“用心前行,V你而来”为题的苏州金龙新V系客车推介会走…

摸鱼大数据——Hive表操作——基本操作

Hive表操作 Hive乱码解决 1、乱码现象 create database test1 comment "乱码测试"; use test1; CREATE TABLE orders ( orderId bigint COMMENT 订单id, orderNo string COMMENT 订单编号, shopId bigint COMMENT 门店id ); 2、处理步骤 注意&#…

关于研发过程中的代码版本控制的思考

文章目录 前言一、研发(1)分支管理(2)代码提交规范(3)版本号控制 二、测试(1)研发自测与用例评审研发自测测试人员测试 (2)BUG反馈与复测(3&#…

HQL面试题练习 —— 合并数据

题目来源:京东 目录 1 题目2 建表语句3 题解 1 题目 已知有数据 A 如下,请分别根据 A 生成 B 和 C。 数据A ------------ | id | name | ------------ | 1 | aa | | 2 | aa | | 3 | aa | | 4 | d | | 5 | c | | 6 | aa…

【软件设计师】程序语言

1.程序设计语言基本概念 1.1 低级语言与高级语言 低级语言:机器语言和汇编语言称为低级语言 机器语言指0.,1组成的机器指令序列 汇编语言指用符号表示指令的语言,如MOV AX,2 高级语言:从人类的逻辑角度出发&#xff0…

WebGL在医学成像方面的应用

WebGL(Web Graphics Library)是一种用于在Web浏览器中呈现3D和2D图形的JavaScript API。它被广泛应用于各种领域,包括医学成像。以下是WebGL在医学成像方面的应用及其详细描述。北京木奇移动技术有限公司,专业的软件外包开发公司&…

蓝牙----wireshark抓包查看蓝牙通信过程

一.完整过程 二.过程详细分析 1.广播数据----可连接的无定向广播包:ADV_IND 2.广播数据----主动扫描:扫描请求(SCAN_REQ) 扫描相应(SCAN_RSP)3.被动扫描数据发送连接请求 4.蓝牙配对(没有用到…

香橙派 AIpro开发板:开启AI视觉的无限可能

前言 在当今这个由数据和智能驱动的时代, 人工智能(AI) 已经成为推动技术创新和实现自动化的关键。 特别是在计算机视觉领域,AI的潜能被无限放大,它使得机器能够“看见”并理解视觉世界,从而执行复杂的任务…

企业内部通讯软件—WorkPlus适配信创即时通讯软件

在现代企业中,良好的内部通讯是保持高效工作和顺利运营的关键。企业内部通讯软件的选择对于提升沟通效率、促进团队合作、保障数据安全和隐私保护至关重要。本文将介绍企业内部通讯软件的重要性探讨一些常用的软件,帮助企业做出明智的选择。 一、企业内…

Java面试八股之synchronized关键字的作用

synchronized关键字的作用 同步与线程安全:synchronized是Java中的一个关键字,用于提供一种同步机制,确保线程安全。它通过在多线程环境中控制对共享资源的访问,防止数据的不一致性问题。 修饰代码块:当synchronized…

cuda 11.6 pytorch安装

在安装之前,需要先配置GPU环境(安装CUDA和CudaNN) 命令行输入nvidia-smi,查看驱动信息 nvidia-smi 安装相应的CUDA 和CUDANN 验证:输入nvcc --version 或者nvcc -V 进行检查 nvcc --version nvcc -V 在anaconda里创建环境 co…

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-KDE卷积神经网络结合…