Как добавить действие on_release к элементу списка в kivy или kivymd, python?

#python #python-3.x #kivy #kivy-language #kivymd

#python #python-3.x #kivy #kivy-language #kivymd

Вопрос:

Я хочу создать приложение для музыкального проигрывателя с использованием kivy и его material design на 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 к элементу списка, который воспроизводит песню (название песни указано в элементе списка). И каждый элемент списка должен иметь собственное название песни в виде текста, и когда мы нажимаем на ярлык, он воспроизводит песню, название которой указано на ярлыке

И если это действие on_release невозможно с OneLineListItem, то что я должен использовать в этом месте (например. MDFlatRectangleButton или что-нибудь еще), а также как я должен использовать его, чтобы мой музыкальный проигрыватель работал нормально (я имею в виду, что будет добавлена функциональность воспроизведения песни)

Ответ №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 файл и где он находится.

Комментарии:

1. Это сработало, но теперь я применил эту логику для воспроизведения песни, и это выдало мне эту ошибку [ОШИБКА] [AudioGstplayer] b’Resource не найден.’ [ОШИБКА] [AudioGstplayer] ошибка b’GStreamer: не удалось изменить состояние, и какой-то элемент не смог опубликовать правильное сообщение об ошибке с указанием причины сбоя.’ [ОШИБКА] [AudioGstplayer] b’Resource не найден.’ [ОШИБКА] [AudioGstplayer] b Ошибка GStreamer: не удалось изменить состояние, и какой-либо элемент не смог опубликовать правильное сообщение об ошибке с указанием причины сбоя

2. определить play_song(self, onelinelistitem): # print(‘play:’, onelinelistitem.text) the_song_path = os.path.abspath(onelinelistitem.text) звук = SoundLoader.load(the_song_path) если звук: sound.play() печать(the_song_path)

3. onelinelistitem.text Это просто имя файла песни и os.path.abspath(onelinelistitem.text) не будет указывать полный путь к файлу. Вам нужно найти способ указать полный путь к файлу (возможно, добавить свойство к onelinelistitem ).