2014-10-03 234 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