SoundLoader перекрывает песни в kivy, python. Как воспроизвести песню вместо другой в python kivy?

Я разрабатывал приложение с использованием python и kivymd.
Это простой музыкальный проигрыватель, который находит всю музыку в телефоне и показывает ее в виде списка.
И когда мы нажимаем на название песни, она воспроизводится. песня Но проблема в том, что песни перекрываются, а затем продолжают перекрываться.
Я хочу, чтобы когда мы нажимали на любую другую песню, предыдущая останавливалась, а та, по которой щелкнули, начинала играть

Мой предыдущий код, в котором нет функции остановки-:

from kivy.lang import Builder
from kivymd.uix.list import OneLineListItem
from kivymd.app import MDApp
from kivy.core.audio import SoundLoader
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)
                    self.root.ids.scroll.add_widget(OneLineListItem(text=required_file, on_release=self.play_song))
                    # print(required_file)

    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)


MainApp().run()

Мой новый код, в котором я попробовал простое исправление с помощью списков, и оно также не сработало -:

from kivy.lang import Builder
from kivymd.uix.list import OneLineListItem
from kivymd.app import MDApp
from kivy.core.audio import SoundLoader
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)
                    self.root.ids.scroll.add_widget(OneLineListItem(text=required_file, on_release=self.play_song))
                    # print(required_file)

    def play_song(self, onelinelistitem):
        SongList = []
        # print('play:', onelinelistitem.text)
        the_song_path = onelinelistitem.secondary_text
        SongList.append(the_song_path)
        if len(SongList) == 1:
            sound = SoundLoader.load(SongList[0])
            if sound:
                sound.play()
            print(the_song_path)
        if len(SongList) > 1:
            SoundLoader.load(SongList[0]).stop()
            sound = SoundLoader.load(SongList[1])
            if sound:
                sound.play()
            print(the_song_path)


MainApp().run()

????Да, я знаю, что это было очень плохое исправление

Пожалуйста, кто-нибудь может помочь мне с этой проблемой

Заранее большое спасибо< /сильный>


person Sanyam Pandey    schedule 10.09.2020    source источник


Ответы (1)


Ваш SongList является локальной переменной в методе play_song() и устанавливается в [] каждый раз, когда вызывается play_song(). Итак условие:

if len(SongList) > 1:

никогда не будет правдой. Простой способ справиться с этим — определить переменную экземпляра, которая содержит воспроизводимый в данный момент звук, назовем ее self.sound. Инициализируйте его в методе build():

def build(self):
    self.sound = None
    screen = Builder.load_string(helper_string)
    return screen

И используйте его в методе play_song():

def play_song(self, onelinelistitem):
    the_song_path = onelinelistitem.secondary_text
    if self.sound:
        self.sound.stop()
    self.sound = SoundLoader.load(the_song_path)
    if self.sound:
        self.sound.play()
    print(the_song_path)
person John Anderson    schedule 10.09.2020