用kivy课程播放/停止音乐

时间:2014-10-03 09:33:53

标签: python oop audio kivy

我试图执行此操作:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.audio import SoundLoader,Sound
from kivy.lang import Builder
Builder.load_string('''
<MenuPage>:
    BoxLayout:
        orientation:'vertical'
        Button:
            text:'play'
            on_press:root.plays()
        Button:
            text:'stop'
            on_press:root.stops()
''') 


class Music(Sound):
    def __init__(self):
        self.sound = SoundLoader.load('/home/hosein/Music/Man.mp3')


class MenuPage(Screen):
    def __init__(self):
        self.M = Music()

    def plays(self):
        self.M.play()

    def stops(self):
        self.M.stop()

music = Music()
sm = ScreenManager()
menu = MenuPage(name='menu')
sm.add_widget(menu)


class TestApp(App):
    def build(self):
        return sm




TestApp().run()

https://gist.github.com/daryasary/f69e1d0444ae70ff5296

只需要两个按钮即可播放或停止播放歌曲。

但它不起作用。解决方案是什么?

此外,有没有办法让播放和停止按钮成为一个按钮,第一次触摸播放歌曲,第二次触摸停止?

3 个答案:

答案 0 :(得分:2)

如果您想使用一个按钮,您可以尝试使用Kivy的ToggleButton并在切换按钮的状态为&#39; down时播放音乐。当国家处于正常状态时,不要播放音乐。

<MenuPage>:
    BoxLayout:
        orientation:'vertical'
        ToggleButton:
            id: music_button
            text:'play'
            on_press:root.play_or_stop()
''')

class MenuPage(Screen):
    def __init__(self):
        self.M = Music()

    def play_or_stop(self):
        if self.music_button.state == 'down':
            self.music_button.text = "Stop"
            self.M.play()
        else:
            self.music_button.text = "Play"
            self.M.stop()

或者,您可以使用常规按钮,在每次按下时将变量设置为True或False。然后,您可以使用此值确定音乐是播放还是停止播放。

答案 1 :(得分:1)

问题是您使用Sound错误。您不应该继承Sound或尝试直接创建新实例。

SoundLoader.load返回使用其中一个可用音频提供程序创建的Sound实例 - 应该使用此实例。尝试这样的事情:

class MenuPage(Screen):
    def __init__(self):
        self.M = SoundLoader.load('/home/hosein/Music/Man.mp3')

    def plays(self):
        self.M.play()

    def stops(self):
        self.M.stop()

    def toggle(self):
        self.M.state = 'play' if self.M.state == 'stop' else 'play'
        return self.M.state

答案 2 :(得分:1)

它应该是这样的:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.audio import SoundLoader,Sound
from kivy.lang import Builder
Builder.load_string('''
<MenuPage>:
    BoxLayout:
        orientation:'vertical'
        Button:
            text:'song'
            on_press:root.plays()
''')

class MenuPage(Screen):
    M = SoundLoader.load('/home/hosein/Music/Man.mp3')

    def plays(self):
        if MenuPage.M.state == 'stop':
            MenuPage.M.play()
        else:
            MenuPage.M.stop()


sm = ScreenManager()
menu = MenuPage(name='menu')
sm.add_widget(menu)


class TestApp(App):
    def build(self):
        return sm




TestApp().run()