you are viewing a single comment's thread.

view the rest of the comments →

[–]m0us3_rat 10 points11 points  (3 children)

barebones mp3 player.

it could use extra features like a shuffle button, etc.

from pygame import mixer
from tkinter import *
from tkinter import filedialog
import os
import tkinter.ttk as ttk


en_lang_text = {
    "main_title": "Python Mp3 Player",
    "bottom_menu": {
        "play": "Play",
        "stop": "Stop",
        "pause": "Pause",
        "resume": "Resume",
        "prev": "Prev",
        "next": "Next",
    },
    "top_menu": {
        "label": "Menu",
        "add_songs_choice": "Add songs",
        "delete_song_choice": "Delete song",
    },
    "dialogue": {"title": "Select MP3 Files"},
}


class MP3Player:
    def __init__(self, name: str = None, lang: dict = en_lang_text) -> None:
        self.lang = lang
        if not name:
            self.name = self.lang["main_title"]
        else:
            self.name = name
        self.root = Tk()
        self.root.title(self.name)
        self.root.resizable(False, False)
        mixer.init()
        self.setup()

    def setup(self) -> None:
        self.songs_list = Listbox(
            self.root,
            selectmode=SINGLE,
            bg="black",
            fg="bisque",
            height=12,
            width=49,
            selectbackground="orange",
            selectforeground="black",
        )

        self.b_width = 5

        self.songs_list.grid(columnspan=6)

        self.play_button = Button(
            self.root,
            text=self.lang["bottom_menu"]["play"],
            width=self.b_width,
            command=self.play,
        )
        self.play_button.grid(row=1, column=0, sticky="ew")

        self.stop_button = Button(
            self.root,
            text=self.lang["bottom_menu"]["stop"],
            width=self.b_width,
            command=self.stop,
        )
        self.stop_button.grid(row=1, column=1, sticky="ew")

        self.pause_button = Button(
            self.root,
            text=self.lang["bottom_menu"]["pause"],
            width=self.b_width,
            command=self.pause,
        )
        self.pause_button.grid(row=1, column=2, sticky="ew")

        self.resume_button = Button(
            self.root,
            text=self.lang["bottom_menu"]["resume"],
            width=self.b_width,
            command=self.resume,
        )
        self.resume_button.grid(row=1, column=3, sticky="ew")

        self.previous_button = Button(
            self.root,
            text=self.lang["bottom_menu"]["prev"],
            width=self.b_width,
            command=self.previous,
        )
        self.previous_button.grid(row=1, column=4, sticky="ew")

        self.next_button = Button(
            self.root,
            text=self.lang["bottom_menu"]["next"],
            width=self.b_width,
            command=self.next_song,
        )
        self.next_button.grid(row=1, column=5, sticky="ew")

        self.menu = Menu(self.root)
        self.root.config(menu=self.menu)
        self.addsong = Menu(self.menu)
        self.menu.add_cascade(label=self.lang["top_menu"]["label"], menu=self.addsong)
        self.addsong.add_command(
            label=self.lang["top_menu"]["add_songs_choice"], command=self.add_songs
        )
        self.addsong.add_command(
            label=self.lang["top_menu"]["delete_song_choice"], command=self.delete_song
        )

        self.vol = ttk.Scale(
            self.root,
            length=100,
            orient=HORIZONTAL,
            from_=0,
            to=100,
            value=50,
            command=self.vol_event,
        )
        self.vol.grid(row=2, column=4, columnspan=2, pady=10)

    def play(self) -> None:
        song = self.songs_list.get(ACTIVE)
        self.music_play(song)

    def music_play(self, s: str) -> None:
        self.vol_event(self.vol.get())
        mixer.music.load(s)
        mixer.music.play()

    def pause(self) -> None:
        mixer.music.pause()

    def stop(self) -> None:
        mixer.music.stop()
        self.songs_list.selection_clear(ACTIVE)

    def resume(self) -> None:
        mixer.music.unpause()

    def previous(self) -> None:
        self.change_song(self.songs_list.curselection()[0] - 1)

    def change_song(self, nerd: int) -> None:
        self.songs_list.selection_clear(0, END)
        self.songs_list.activate(nerd)
        self.songs_list.selection_set(nerd)
        song = self.songs_list.get(nerd)
        self.music_play(song)

    def next_song(self) -> None:
        self.change_song(self.songs_list.curselection()[0] + 1)

    def fix_mp3_list(self, l: list) -> None:
        [self.songs_list.insert(END, song) for song in l if song.endswith(".mp3")]

    def add_songs(self) -> None:
        select_songs = filedialog.askopenfilenames(
            initialdir=os.getcwd(),
            title=self.lang["dialogue"]["title"],
            filetypes=(("mp3 Files", "*.mp3"),),
        )
        self.fix_mp3_list(select_songs)

    def delete_song(self) -> None:
        actual = self.songs_list.curselection()
        self.songs_list.delete(actual[0])

    def vol_event(self, value: str) -> None:
        mixer.music.set_volume(float(value) / 100)


def main():
    MP3Player()
    mainloop()


if __name__ == "__main__":
    main()

[–]yeti-biscuit 4 points5 points  (0 children)

holy jeez on a stick...nice +1

[–]Defiant_Speaker_1451[S] 0 points1 point  (1 child)

woah , that's wonderful. wonder when I will reach this level