最終更新日:181113 原本2016-10-10 

Kivyで、シンプルなミュージックプレイヤー①


http://blog.livedoor.jp/chun_chun_02/archives/1030938051.html
https://github.com/JasonHinds13/KVMusicPlayer/blob/master/main.py
を参考につくった、非常にシンプルなミュージックプレイヤーです。

ボリュームの調整やシーク機能等はなく、機能としてはシンプルです。

起動すると、まずこの画面。


Choose Fileで、mp3を選択します。


選択(ダブルクリック)すると、再生が始まります。


一時停止ボタン(||)を押すと、止まります。
>ボタンに変わるので、押したら一時停止の場所からスタートです。


kivy1.9.1
python3.4
です。

main.py
  1.  
  2. import os
  3. from kivy.app import App
  4. from kivy.core.audio import SoundLoader
  5. from kivy.properties import ObjectProperty
  6. from kivy.uix.boxlayout import BoxLayout
  7. from kivy.uix.popup import Popup
  8.  
  9.  
  10. class PopupChooseFile(BoxLayout):
  11.  
  12. # 現在のカレントディレクトリ。FileChooserIconViewのpathに渡す
  13. current_dir = os.path.dirname(os.path.abspath(__file__))
  14.  
  15. # MusicPlayerクラス内で参照するための設定
  16. select = ObjectProperty(None)
  17. cancel = ObjectProperty(None)
  18.  
  19.  
  20. class MusicPlayer(BoxLayout):
  21.  
  22. audio_button = ObjectProperty(None) # >や||のボタンへのアクセス
  23. status = ObjectProperty(None) # 画面中央のお知らせとなるテキスト部分
  24. sound = None
  25.  
  26. def choose(self):
  27. """Choose File押下時に呼び出され、ポップアップでファイル選択させる"""
  28.  
  29. content = PopupChooseFile(select=self.select, cancel=self.cancel)
  30. self.popup = Popup(title="Select MP3", content=content)
  31. self.popup.open()
  32.  
  33. def play_or_stop(self):
  34. """||や>押下時。再生中なら一時停止、停止中なら再生する"""
  35.  
  36. # ファイルが選択されていればTrue
  37. if self.sound:
  38.  
  39. # 再生中
  40. if self.sound.state == "play":
  41. self.sound_position = self.sound.get_pos() # 再生位置の保存
  42. self.sound.stop()
  43. self.audio_button.text = ">"
  44. self.status.text = 'Stop {}'.format(self.sound_name)
  45.  
  46. # 一時停止中
  47. elif self.sound.state == "stop":
  48. self.sound.play()
  49. self.sound.seek(self.sound_position) # 再生位置の復元
  50. self.audio_button.text = "||"
  51. self.status.text = 'Playing {}'.format(self.sound_name)
  52.  
  53. # ファイルを選択してないなら、選択しろと画面中央に表示
  54. else:
  55. self.status.text = 'Please Select MP3'
  56.  
  57. def cancel(self):
  58. """ファイル選択画面でキャンセル"""
  59.  
  60. self.popup.dismiss()
  61.  
  62. def select(self, path):
  63. """ファイル選択画面で、ファイル選択時"""
  64.  
  65. # 既に再生している物があればストップ
  66. if self.sound:
  67. self.sound.stop()
  68.  
  69. self.sound = SoundLoader.load(path)
  70. self.sound_name = os.path.basename(path)
  71.  
  72. # 再生を試みて、できない(mp3じゃない)ならexcept。MP3にしろとメッセージ
  73. try:
  74. self.sound.play()
  75. except AttributeError:
  76. self.status.text = 'Should MP3'
  77. else:
  78. self.audio_button.text = "||"
  79. self.status.text = 'Playing {}'.format(self.sound_name)
  80. finally:
  81. self.popup.dismiss()
  82.  
  83.  
  84. class Music(App):
  85. icon = "ico.png"
  86.  
  87. def build(self):
  88. return MusicPlayer()
  89.  
  90.  
  91. if __name__ == "__main__":
  92. Music().run()


music.kv
  1.  
  2. <MusicPlayer>:
  3. status: status_text
  4. audio_button: audio_button
  5.  
  6. orientation: 'vertical'
  7. padding: 20
  8.  
  9. Label:
  10. size_hint: 1, .9
  11. id: status_text
  12. text: ""
  13. center: root.center
  14. color: 1, 0, 0, 1
  15.  
  16. BoxLayout:
  17. size_hint: 1, .1
  18. Button:
  19. id: audio_button
  20. size_hint: .5, 1
  21. text: '||'
  22. background_color: 0, .5, 1, 1
  23. on_release: root.play_or_stop()
  24.  
  25. Button:
  26. size_hint: .5, 1
  27. text: 'Choose File'
  28. background_color: 0, .5, 1, 1
  29. on_release: root.choose()
  30.  
  31.  
  32. <PopupChooseFile>:
  33. canvas:
  34. Color:
  35. rgba: 0, 0, .4, 1
  36. Rectangle:
  37. pos: self.pos
  38. size: self.size
  39. orientation: "vertical"
  40.  
  41. FileChooserIconView:
  42. size_hint: 1, .9
  43. path: root.current_dir
  44. on_submit: root.select(self.selection[0])
  45. BoxLayout:
  46. size_hint: 1, .1
  47. Button:
  48. text: "Cancel"
  49. background_color: 0,.5,1,1
  50. on_release: root.cancel()


Audio
https://kivy.org/docs/api-kivy.core.audio.html

FileChooser
https://kivy.org/docs/api-kivy.uix.filechooser.html