【问题标题】:How to add on_release action to a list item in kivy or kivymd, python?如何将 on_release 操作添加到 kivy 或 kivymd、python 中的列表项?
【发布时间】:2020-12-27 10:03:46
【问题描述】:

我想使用 kivy 制作一个音乐播放器应用程序,它是 python 中的材料设计 我成功找到 .mp3 文件并播放它们 但问题是我无法找到绑定 OneLineListItem 到任何函数(例如,如果我们单击并释放列表项,我想让 python 播放那首歌)我的代码是 -:

from kivy.lang import Builder
from kivymd.uix.list import OneLineListItem
from kivymd.app import MDApp
import os

helper_string = """
Screen:
    BoxLayout:
        orientation: "vertical"
        ScrollView:
            MDList:
                id: scroll

"""


class MainApp(MDApp):
    def build(self):
        screen = Builder.load_string(helper_string)
        return screen

    def on_start(self):
        for root, dirs, files in os.walk('C:/'):
            for file in files:
                if file.endswith('.mp3'):
                    required_file = file
                    the_location = os.path.abspath(required_file)
                    location_list = list(the_location)
                    song_name = list(required_file)
                    self.root.ids.scroll.add_widget(OneLineListItem(text=required_file))
                    # print(required_file)


MainApp().run()

您可以看到,在这段代码中,for 循环遍历所有文件并将它们添加到滚动视图中 我想让 for 循环向播放歌曲的列表项添加一个 on_release 操作(列表项上的歌曲名称)。每个列表项都应该有自己的歌曲名称作为文本,当我们点击标签时,它将播放名称在标签上的歌曲

如果 OneLineListItem 无法执行此 on_release 操作,那么我应该在那个地方使用什么(例如 MDFlatRectangleButton 或其他任何东西)以及我应该如何使用它来使我的音乐播放器正常工作(我的意思是会增加播放歌曲的功能)

【问题讨论】:

    标签: python python-3.x kivy kivy-language kivymd


    【解决方案1】:

    on_release 操作是可能的,因为OneLineListItem 继承了ButtonBehavior。所以你只需要指定它,像这样:

    self.root.ids.scroll.add_widget(OneLineListItem(text=required_file, on_release=self.play_song))
    

    然后在您的App 中,添加play_song() 方法:

    def play_song(self, onelinelistitem):
        print('play:', onelinelistitem.text)
    

    当然,你需要添加如何播放mp3文件的逻辑,以及它在哪里。

    【讨论】:

    • 这行得通,但现在我应用这个逻辑来播放这首歌,它给了我这个错误 [ERROR ] [AudioGstplayer] b'Resource not found。' [错误] [AudioGstplayer] b'GStreamer 错误:状态更改失败,某些元素未能发布正确的错误消息并说明失败的原因。' [错误] [AudioGstplayer] b'找不到资源。' [错误] [AudioGstplayer] b'GStreamer 错误:状态更改失败,某些元素未能发布正确的错误消息,原因是失败
    • def play_song(self, onelinelistitem): # print('play:', onelinelistitem.text) the_song_path = os.path.abspath(onelinelistitem.text) sound = SoundLoader.load(the_song_path) if sound : sound.play() print(the_song_path)
    • onelinelistitem.text 只是歌曲文件的名称,os.path.abspath(onelinelistitem.text) 不会提供文件的完整路径。您需要找到一种方法来提供文件的完整路径(可能在onelinelistitem 中添加一个属性)。
    【解决方案2】:

    虽然不播放歌曲但打印了所选项目,但为我工作

    【讨论】:

    猜你喜欢
    • 2012-09-23
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2021-07-16
    相关资源
    最近更新 更多