2014-10-03 178 views
1

类我试图执行此:播放/停止音乐与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

应该有播放或停止播放,只是两个按钮。

但它不起作用。解决办法是什么?

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

回答

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() 
2

如果您想使用一个按钮,您可以尝试使用Kivy的ToggleButton,并在切换按钮的状态为“关闭”时播放音乐,而在状态为“正常”时不播放音乐。

<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

问题是您使用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 
+0

的感谢!你的权利,但问题仍然存在。在程序的__main__中我不能使用>>> menu = MenuPage(name ='menu')!!! – 2014-10-05 09:21:30

+0

这听起来像是一个不同的问题,你应该问一个单独的问题。 – 2014-10-06 14:15:06