Python Forum
Basic Music Player with tkinter
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Basic Music Player with tkinter
#1
#! /usr/bin/env python3

import tkinter as tk
import pygame as pg
from os import listdir, chdir
from functools import partial
import re

class MusicPlayer:
    def __init__(self, parent):
        self.parent = parent
        self.parent.columnconfigure(0, weight=1, uniform='cols')
        self.parent.columnconfigure(1, weight=1, uniform='cols')
        self.parent.rowconfigure(0, weight=1)

        self.mytext = None

        pg.init()
        pg.mixer.init()

        track_label_frame = tk.LabelFrame(self.parent, text='Track')
        track_label_frame.grid(column=0, row=0, sticky='new')
        for i in range(2):
            track_label_frame.grid_columnconfigure(i, weight=3, uniform='labels')

        self.label = tk.Label(track_label_frame, text=None, bg='lightblue')
        self.label['relief'] = 'groove'
        self.label.grid(column=1, row=0, sticky='new')

        self.status = tk.Label(track_label_frame, text=None, bg='lightblue')
        self.status['relief'] = 'groove'
        self.status.grid(column=0, row=0, sticky='new')


        btn_label_frame = tk.LabelFrame(self.parent, text='Controls')
        btn_label_frame.grid(column=0, row=1, sticky='new')
        for i in range(4):
            btn_label_frame.grid_columnconfigure(i, weight=3, uniform='btns')

        self.btn_play = tk.Button(btn_label_frame, text='Play')
        self.btn_play['command'] = partial(self.play, state=0)
        self.btn_play.grid(column=0, row=0, sticky='new', padx=3, pady=2)

        btn_stop = tk.Button(btn_label_frame, text='Stop')
        btn_stop['command'] = partial(self.play, state=None)
        btn_stop.grid(column=1, row=0, sticky='new', padx=3, pady=2)

        btn_next = tk.Button(btn_label_frame, text='Next')
        btn_next['command'] = partial(self.nextsong)
        btn_next.grid(column=2, row=0, sticky='new', padx=3, pady=2)

        track_list_frame = tk.LabelFrame(self.parent, text='Track List')
        track_list_frame.grid(column=1, row=0, rowspan=2, sticky='news')
        track_list_frame.grid_columnconfigure(0, weight=3)
        track_list_frame.grid_rowconfigure(0, weight=3)

        scrollbar = tk.Scrollbar(track_list_frame, orien='vertical')
        self.playlist = tk.Listbox(track_list_frame, yscrollcommand=scrollbar.set, \
        selectbackground='lightblue', selectforeground='navy', selectmode='single', width=50)
        scrollbar.grid(column=1, row=0, sticky='news')
        scrollbar.config(command=self.playlist.yview)
        self.playlist.grid(column=0, row=0, sticky='news')

        chdir('My Music')
        songs = listdir()
        for song in songs:
            self.playlist.insert(tk.END, song)


    def play(self, state):
        if state == 0:
            display_label = self.playlist.get(tk.ACTIVE)[:-4]
            patt = r'\w+\s\w+'
            label = ' '.join(re.findall(patt, display_label))
            self.label['text'] = label
            self.status['text'] = 'Now Playing'

            pg.mixer.music.load(self.playlist.get(tk.ACTIVE))
            pg.mixer.music.play()
            self.btn_play['text'] = 'Pause'
            self.btn_play['command'] = partial(self.play, state=1)
            if not self.playlist.curselection():
                self.playlist.select_set(0)
            else:
                self.playlist.select_set(self.playlist.curselection()[0])

        elif state == 1:
            self.status['text'] = 'Paused'
            pg.mixer.music.pause()
            self.btn_play['text'] = 'Play'
            self.btn_play['command'] = partial(self.play, state=2)
        elif state == 2:
            self.status['text'] = 'Now Playing'
            pg.mixer.music.unpause()
            self.btn_play['text'] = 'Pause'
            self.btn_play['command'] = partial(self.play, state=1)
        else:
            self.status['text'] = 'Stopped'
            pg.mixer.music.stop()
            self.btn_play['command'] = partial(self.play, state=0)
            self.btn_play['text'] = 'Play'


    def nextsong(self):
        pg.mixer.music.stop()
        select_index = self.playlist.curselection()
        next_select = 0

        if len(select_index) > 0:
            last_select = int(select_index[-1])

            self.playlist.selection_clear(select_index)

            if last_select < self.playlist.size() - 1:
                next_select = last_select + 1
        self.playlist.activate(next_select)
        self.playlist.selection_set(next_select)
        self.play(state=0)


def main():
    root = tk.Tk()
    root.title('Tkinter Music Player')
    MusicPlayer(root)
    root.mainloop()

main()
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply


Messages In This Thread
Basic Music Player with tkinter - by menator01 - Jul-15-2021, 03:58 PM
RE: Basic Music Player with tkinter - by menator01 - Jul-26-2021, 07:23 PM
RE: Basic Music Player with tkinter - by ndc85430 - Jul-30-2021, 10:48 AM
RE: Basic Music Player with tkinter - by menator01 - Jul-30-2021, 06:44 PM
RE: Basic Music Player with tkinter - by ndc85430 - Jul-31-2021, 04:27 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  PyQt5 Music Player menator01 22 14,317 Nov-03-2021, 05:59 PM
Last Post: Axel_Erfurt
  Tkinter basic email client menator01 4 3,647 Jul-23-2020, 08:16 AM
Last Post: ndc85430

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020