PythonでMP3再生(早送り、巻き戻しとGetter、Setter)
でMP3再生のアプリを試していて、思ったこと。MyPlayerクラスのメソッドとして
再生中の曲の現在位置(開始何秒か・・)を取得するのが
def get_curr_pos(self):
return self.playback.curr_pos
でした。一方で、指定位置まで飛ぶseekという関数があるから、それを使ったら
def set_pos(self,pos):
self.playback.seek(pos)
のようなメソッドも書ける。
それなら、二つをまとめたい。
位置pos というプロパティを、読み出しに使ったときはget_curr_posが呼ばれ、書き込みにつかったときはset_pos が呼ばれるようにすると便利。
たとえば、5秒早送りを
player.pos = player.pos + 5.0
といった感じで表現できると、直感的でうれしい。
この辺をうまいことやってくれそうなGetter,Setterの扱いをCopilot先生に聞いてみました。
Copilot先生のサンプルコードでは、内部の変数として_valueを持っていますが、例えば再生位置posの値であれば、再生中刻々と変化するわけで、変数で持つ必要もない。ライブラリ中で次のように書けることでしょう。
class MyPlayer(CustomPlayer):
@property
def pos(self):
return self.playback.curr_pos
@pos.setter
def pos(self, seekpos):
self.playback.seek(seekpos)
これ使って5秒早送り、5秒巻き戻しを実装してみます。
class App(ctk.CTk):
def __init__(self, title):
# 抜粋
# 5秒早送り
ctk.CTkButton(self, text="5秒送り", command=self.ffw).pack(
padx=50, pady=10
)
# 5秒巻き戻し
ctk.CTkButton(self, text="5秒戻し", command=self.rew).pack(
padx=50, pady=10
)
def ffw(self):
self.player.pos = self.player.pos + 5.0
def rew(self):
self.player.pos = self.player.pos - 5.0
実行テスト
思ったような動作になりました。
今回もテスト用のmp3ファイルには、「甘茶の音楽工房」様の「残業戦士」
という曲を使わせていただいています。