Есть ли способ, которым я мог бы выбрать песню из FileListView (щелчком мыши), загрузить ее в Soundloader и воспроизвести с помощью кнопки ВОСПРОИЗВЕДЕНИЯ?

#python #kivy #mp3 #audio-player

#python #kivy #mp3 #аудиоплеер

Вопрос:

#Итак, это простой mp3-плеер, который я пытаюсь создать на python / kivy. Я использую FileListView для отображения моих файлов mp3. Есть ли способ, которым я мог бы выбрать песню из FileListView (щелчком мыши), загрузить ее в Soundloader и воспроизвести с помощью кнопки ВОСПРОИЗВЕДЕНИЯ?#

         import os  
        import kivy  
        from kivy.app import App  
        from kivy.uix.button import Button  
        from kivy.uix.boxlayout import BoxLayout  
        from kivy.uix.label import Label  
        from kivy.uix.floatlayout import FloatLayout  
        from kivy.uix.gridlayout import GridLayout  
        from kivy.uix.image import AsyncImage  
        from kivy.uix.filechooser import FileChooserListView  
        from kivy.core.audio import SoundLoader  
        from kivy.loader import Loader  
        from kivy.uix.screenmanager import ScreenManager  


           def callback(instance):  
               print('The button <%s> is being pressed' % instance.text)  


             red = [1, 0, 0, 1]  
             green = [0, 1, 0, 1]  
             blue = [0, 0, 1, 1]  
             purple = [1, 0, 1, 1]  


        class myLayout(BoxLayout):  

             color = [red, green, blue, purple]  

             path = '/home/edward/Music'  


           def __init__(self, **kwargs):  
             super(myLayout, self).__init__(**kwargs)  

             layout = BoxLayout(pos=self.pos, size=self.size,spacing=10)  

            self.add_widget(layout)  

            flc = FileChooserListView(path='/home/edward/Music',filters=['*.mp3'],size=(7, 3))  
            flc.bind(on_selection=self.load_sound)  

             layout.add_widget(flc)  

        # creating the play button  

            play = Button(text="PLAY",valign='center', halign='center',background_color=blue,size_hint=(0.3, 0.5))  

              play.bind(on_press=self.play_pressed)  
              layout.add_widget(play)  

        # creating the stop button  

              stop = Button(text="STOP", valign='center',halign='center',size_hint=(0.3, 0.6),background_color=red)  
              layout.add_widget(stop)  
              stop.bind(on_press=self.stop_pressed)  

        #creating a Label  

             display=Label(text="kiwiAudioPlayer",halign='right', size=(3,5))

             layout.add_widget(display)  

        #displaying an animated image  

         animate = AsyncImage(source='https://i.gifer.com/KNGq.gif',                              allow_stretch=False, anim_delay=0.10)  

              layout.add_widget(animate)  

        #trying to define a load song function  

           def load_sound(self, filename):

                sound = FileChooserListView.selection(self.path)
              with open(os.path.join(self.path, filename[0])):
                if sound is None:
                    sound = SoundLoader.load(self.path)
                if sound.status != 'stop':
                    sound.stop()
   
                    sound.play()
 
         #play button function

           def play_pressed(self, sound, play):  

                sound = SoundLoader.load(self.path)  
                if sound is None:  
                    sound.play()  

      #stop button function  

           def stop_pressed(self, sound, stop):  

                sound = SoundLoader.unload(self.path)  
                sound.stop()  

#main function

      class musicApp(App):  

           def build(self):  

              return myLayout()  

   if __name__ == "__main__":  
           app = musicApp()  
           app.run()  
  

# итак, вопрос в том, как я могу на самом деле объединить Filelistview и модули Soundloader, чтобы я мог щелкнуть песню из списка и воспроизвести ее мгновенно?

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

1. Я младший и действительно новичок в python, так что … любая помощь будет высоко оценена!

Ответ №1:

Несколько изменений заставляют ваш код работать. Во-первых, ваша привязка к filechooser selection должна использовать имя свойства, например:

 flc.bind(selection=self.load_sound)    
  

Затем создание переменной экземпляра для хранения звука упрощает обработку. Вот модифицированная версия вашего кода с этими изменениями:

 from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.image import AsyncImage
from kivy.uix.filechooser import FileChooserListView
from kivy.core.audio import SoundLoader


def callback(instance):
   print('The button <%s> is being pressed' % instance.text)


red = [1, 0, 0, 1]
green = [0, 1, 0, 1]
blue = [0, 0, 1, 1]
purple = [1, 0, 1, 1]


class myLayout(BoxLayout):

    color = [red, green, blue, purple]
    path = '/home/edward/Music'


    def __init__(self, **kwargs):
        super(myLayout, self).__init__(**kwargs)
        self.sound = None

        layout = BoxLayout(pos=self.pos, size=self.size,spacing=10)

        self.add_widget(layout)

        flc = FileChooserListView(path='/home/edward/Music',filters=['*.mp3'],size=(7, 3))
        flc.bind(selection=self.load_sound)  # bind to the property `selection`

        layout.add_widget(flc)

        # creating the play button

        play = Button(text="PLAY",valign='center', halign='center',background_color=blue,size_hint=(0.3, 0.5))

        play.bind(on_press=self.play_pressed)
        layout.add_widget(play)

        # creating the stop button

        stop = Button(text="STOP", valign='center',halign='center',size_hint=(0.3, 0.6),background_color=red)
        layout.add_widget(stop)
        stop.bind(on_press=self.stop_pressed)

        #creating a Label

        display=Label(text="kiwiAudioPlayer",halign='right', size=(3,5))

        layout.add_widget(display)

        #displaying an animated image

        animate = AsyncImage(source='https://i.gifer.com/KNGq.gif',                              allow_stretch=False, anim_delay=0.10)

        layout.add_widget(animate)

    #trying to define a load song function

    def load_sound(self, filechooser, selection):

        # sound = FileChooserListView.selection(self.path)
        # with open(os.path.join(self.path, filename[0])):
        #     if sound is None:
        #         sound = SoundLoader.load(self.path)
        #     if sound.status != 'stop':
        #         sound.stop()
        if self.sound is not None:
            self.sound.stop()
        self.sound = SoundLoader.load(selection[0])

    #play button function

    def play_pressed(self, button):

        # sound = SoundLoader.load(self.path)
        # if sound is None:
        #     sound.play()
        if self.sound is not None:
            self.sound.play()

    #stop button function

    def stop_pressed(self, button):

        # sound = SoundLoader.unload(self.path)
        # sound.stop()
        if self.sound is not None:
            self.sound.stop()

#main function

class musicApp(App):

   def build(self):

      return myLayout()

if __name__ == "__main__":
       app = musicApp()
       app.run()
  

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

1. большое вам спасибо за вашу помощь, мистер Андерсон! Я надеюсь, что, по крайней мере, я заставил вас смеяться над нерелевантными строками кода, которые вы должны были прокомментировать. 🙂

2. Теперь, когда я снова просматриваю ее .. ошибка имени свойства в назначении filechooser была просто глупостью, но помимо этого я многому научился сегодня. еще раз спасибо