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

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

在方法内对于不同的系统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]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 数组——排序算法的函数实现

目录 交换法排序 用交换法对成绩数组升序排序 选择法排序 冒泡法排序 归并法排序 交换法排序 用交换法对成绩数组升序排序 选择法排序 冒泡法排序 归并法排序

拼多多商品详情商品标题sku等信息抓取接口API调用步骤演示

接口名称:item_get_app_pro 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_sho…

区块链技术引领:Web3时代的新网络革命

随着区块链技术的快速发展和不断成熟,人们已经开始意识到它所带来的潜在影响,尤其是在构建一个更加去中心化、安全和透明的互联网时。这个新的互联网时代被称为Web3,它将不再受制于传统的中心化平台,而是更多地依赖于去中心化的网…

【C++】<图形库> EasyX基础使用

文章目录 一、安装EasyX库 二、图形窗口显示 三、基本绘图函数 四、图片显示 五、键盘交互 六、鼠标交互 七、双缓冲区解决闪屏 一、安装EasyX库 已经有兄弟写得很清楚了,见EasyX | 安装教程(详细图文)。 二、图形窗口显示 1. 包含的…

uni-app 接入微信短剧播放器

前言 作为一个 uniapp 初学者,恰巧遇到微信短剧播放器接入的需求,在网上检索许久并没有发现傻瓜式教程。于是总结 uni-app 官网文档及微信开放文档,自行实践后,总结出几个步骤,希望为大家提供些帮助。实践后发现其实确…

42.接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的,学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS,是软件的一部分,它是硬件基础上的第一层软件,是硬件和其它软件沟通的桥梁。 操作系统…

抖音小店出单之后怎么发货?抖店详细发货流程来了

大家好,我是喷火龙。 抖音小店发货是有规则的,如果出现超时发货或者虚假发货都会被平台处罚的,会影响我们店铺的评分和正常运营,还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…

夏季天气炎热没胃口怎么办?没食欲,心情浮躁怎么调理?

点击文末领取中医揿针的视频教程跟直播讲解 夏季天气炎热,很容易就让人出现胃口不佳的情况,再加上不少人需要长期服药,或是受到病痛困扰,更是严重影响了食欲。 夏养心 夏季,在这个季节,心脏的负担是很重…

JVM学习-对象实例化、内存布局、访问定位

对象实例化 创建对象方式 创建对象步骤 判断对象对应的类是否加载、链接、初始化 虚拟机遇到一个new指令,首先会去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析、初始化(判断…

【源码+文档+调试讲解】可信捐赠系统的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统可信捐赠系统信息管理难度大,容错率低&#x…

【基于Fluent和深度学习算法驱动的流体力学计算与应用】

在深度学习与流体力学融合的背景下,科研边界不断拓展,创新成果层出不穷。从物理模型融合到复杂流动模拟,从数据驱动研究到流场智能分析,深度学习正以前所未有的力量重塑流体力学领域。目前在Nature和Science杂志上发表的深度学习驱…

香橙派 Kunpeng Pro 上手初体验

香橙派 Kunpeng Pro 上手初体验 目录 香橙派 Kunpeng Pro 上手初体验1.前言2.开箱3.开发板资源介绍硬件规格参数外观规格参数4.系统环境搭建系统镜像烧录ssh连接5.简单测试6.总结 1.前言 我很荣幸能收到了来自CSDN的测评邀请,让我有机会对香橙派最新推出的Kunpeng …

10个最佳人物素材网站推荐,免费获取第一个PNG文件!

人物素材是设计中应用最广泛的元素之一。无论是网页设计还是移动终端设计,人物素材的插画设计都比文字信息更容易吸引用户的注意力。作为内容呈现,还可以增加设计的艺术属性。为了节省大家寻找人物素材的时间成本,本文立即为大家整理了10个宝…

ARM IHI0069F GIC architecture specification (8)

3.2中断旁路支持 CPU interface可以支持中断信号旁路,使得当接口发出的中断信号被禁用时,传统中断信号被传递到PE上的中断请求输入,从而绕过GIC功能。 是否支持旁路由实际设计决定。 用于确定是否使用GICv3 FIQ和IRQ输出或旁路信号的控制取决…

Xinstall地推效果大揭秘:洞察用户需求,创新营销策略不再是难题

在互联网流量红利逐渐衰退的今天,企业如何快速搭建起满足用户需求的运营体系,成为了亟待解决的问题。特别是在地推领域,如何在多变的互联网环境下,迅速、有效地触达用户,扩大目标用户基数和流量池,成为了企…

计算机类主题会议推荐之——ACAIB 2024

【北方民族大学40 周年校庆学术活动】 第四届自动化控制、算法与智能仿生学术会议(ACAIB 2024) 2024年6月7-9日 中国银川 往届均已见刊检索 EI、SCOPUS双检索 基本信息 会议官网:www.acaib.org 最终截稿时间:2024年6月3日晚23:…

自定义CSS属性(@property)解决自定义CSS变量无法实现过渡效果的问题

且看下面的代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>demot</title&g…

HX-100调频广播覆盖专用天线

HX-100全向天线是北京恒星科通科技发展有限公司自主研发的一款隧道专用宽带调频发射天线&#xff0c;采用圆盘形结构、振子采用铝合金材料制造&#xff0c;具有增益高、功率容量大、工作频带宽、安装方便、防腐防潮、抗风性能好等特点&#xff0c;特别适合隧道调频广播覆盖、地…

多语言跨境电商源码:迅狐系统的创新融合

在全球化经济的浪潮中&#xff0c;跨境电商正成为连接不同国家和地区消费者的重要桥梁。迅狐多商户跨境电商商城系统&#xff0c;以其创新的技术解决方案&#xff0c;将传统销售模式与新型电商营销手段完美融合&#xff0c;为用户和技术商提供了一个多语言、多功能的跨境电商平…