torinaブログ

DjangoとBootstrap4で作成したブログ
Python, Django, Kivy, Bootstrap, Apache等のメモです
ソースコード

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

Python Kivy Kivy
約133日前 2016年10月10日7:58
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
import os
from kivy.app import App
from kivy.core.audio import SoundLoader
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup


class PopupChooseFile(BoxLayout):

    # 現在のカレントディレクトリ。FileChooserIconViewのpathに渡す
    current_dir = os.path.dirname(os.path.abspath(__file__))

    # MusicPlayerクラス内で参照するための設定
    select = ObjectProperty(None)
    cancel = ObjectProperty(None)


class MusicPlayer(BoxLayout):

    audio_button = ObjectProperty(None)  # >や||のボタンへのアクセス
    status = ObjectProperty(None)  # 画面中央のお知らせとなるテキスト部分
    sound = None

    def choose(self):
        """Choose File押下時に呼び出され、ポップアップでファイル選択させる"""

        content = PopupChooseFile(select=self.select, cancel=self.cancel)
        self.popup = Popup(title="Select MP3", content=content)
        self.popup.open()

    def play_or_stop(self):
        """||や>押下時。再生中なら一時停止、停止中なら再生する"""

        # ファイルが選択されていればTrue
        if self.sound:

            # 再生中
            if self.sound.state == "play":
                self.sound_position = self.sound.get_pos()  # 再生位置の保存
                self.sound.stop()
                self.audio_button.text = ">"
                self.status.text = 'Stop {}'.format(self.sound_name)

            # 一時停止中
            elif self.sound.state == "stop":  
                self.sound.play()
                self.sound.seek(self.sound_position)  # 再生位置の復元
                self.audio_button.text = "||"
                self.status.text = 'Playing {}'.format(self.sound_name)

        # ファイルを選択してないなら、選択しろと画面中央に表示
        else:
            self.status.text = 'Please Select MP3'

    def cancel(self):
        """ファイル選択画面でキャンセル"""

        self.popup.dismiss()

    def select(self, path):
        """ファイル選択画面で、ファイル選択時"""

        # 既に再生している物があればストップ
        if self.sound:
            self.sound.stop()

        self.sound = SoundLoader.load(path)
        self.sound_name = os.path.basename(path)

        # 再生を試みて、できない(mp3じゃない)ならexcept。MP3にしろとメッセージ
        try:
            self.sound.play()
        except AttributeError:
            self.status.text = 'Should MP3'
        else:
            self.audio_button.text = "||"
            self.status.text = 'Playing {}'.format(self.sound_name)
        finally:
            self.popup.dismiss()


class Music(App):
    icon = "ico.png"

    def build(self):
        return MusicPlayer()


if __name__ == "__main__":
    Music().run()


music.kv
<MusicPlayer>:
    status: status_text
    audio_button: audio_button

    orientation: 'vertical'
    padding: 20

    Label:
        size_hint: 1, .9
        id: status_text
        text: ""
        center: root.center
        color: 1, 0, 0, 1

    BoxLayout:
        size_hint: 1, .1
        Button:
            id: audio_button
            size_hint: .5, 1
            text: '||'
            background_color: 0, .5, 1, 1
            on_release: root.play_or_stop()

        Button:
            size_hint: .5, 1
            text: 'Choose File'
            background_color: 0, .5, 1, 1
            on_release: root.choose()


<PopupChooseFile>:
    canvas:
        Color:
            rgba: 0, 0, .4, 1
        Rectangle:
            pos: self.pos
            size: self.size
    
    orientation: "vertical"

    FileChooserIconView:
        size_hint: 1, .9
        path: root.current_dir
        on_submit: root.select(self.selection[0])
    BoxLayout:
        size_hint: 1, .1
        Button:
            text: "Cancel"
            background_color: 0,.5,1,1
            on_release: root.cancel()


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

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