Advertisement
amv1991

Player MP3 (com Tkinter)

Jan 31st, 2021
1,328
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.06 KB | None | 1 0
  1. import os
  2. import pickle
  3. import tkinter as tk
  4. from tkinter import filedialog
  5. from tkinter import PhotoImage
  6. from pygame import mixer
  7.  
  8. class Player(tk.Frame):
  9.     def __init__(self, master=None):
  10.         super().__init__(master)
  11.         self.master = master
  12.         self.pack()
  13.         mixer.init()
  14.  
  15.         if os.path.exists('songs.pickle'):
  16.             with open('songs.pickle', 'rb') as f:
  17.                 self.playlist = pickle.load(f)
  18.         else:
  19.             self.playlist=[]
  20.  
  21.         self.current = 0
  22.         self.paused = True
  23.         self.played = False
  24.  
  25.         self.create_frames()
  26.         self.track_widgets()
  27.         self.control_widgets()
  28.         self.tracklist_widgets()
  29.  
  30.         self.master.bind('<Left>', self.prev_song)
  31.         self.master.bind('<space>', self.play_pause_song)
  32.         self.master.bind('<Right>', self.next_song)
  33.  
  34.     def create_frames(self):
  35.         self.track = tk.LabelFrame(self, text='Faixa de som',
  36.                     font=("times new roman",15,"bold"),
  37.                     bg="#4D1C00",fg="white",bd=5,relief=tk.GROOVE)
  38.         self.track.config(width=410,height=300)
  39.         self.track.grid(row=0, column=0, padx=10)
  40.  
  41.         self.tracklist = tk.LabelFrame(self, text=f'Lista {str(len(self.playlist))} músicas',
  42.                             font=("times new roman",11,"bold"),
  43.                             bg="#4D1C00",fg="white",bd=5,relief=tk.GROOVE)
  44.         self.tracklist.config(width=190,height=400)
  45.         self.tracklist.grid(row=0, column=1, rowspan=3, pady=5)
  46.  
  47.         self.controls = tk.LabelFrame(self,
  48.                             font=("times new roman",15,"bold"),
  49.                             bg="light grey",fg="white",bd=2,relief=tk.GROOVE)
  50.         self.controls.config(width=410,height=80)
  51.         self.controls.grid(row=2, column=0, pady=5, padx=10)
  52.  
  53.     def track_widgets(self):
  54.         self.canvas = tk.Label(self.track, image=img)
  55.         self.canvas.configure(width=400, height=240)
  56.         self.canvas.grid(row=0,column=0)
  57.  
  58.         self.songtrack = tk.Label(self.track, font=("times new roman",16,"bold"),
  59.                         bg="white",fg="dark blue")
  60.         self.songtrack['text'] = 'Player MP3'
  61.         self.songtrack.config(width=30, height=1)
  62.         self.songtrack.grid(row=1,column=0,padx=10)
  63.  
  64.     def control_widgets(self):
  65.         self.loadSongs = tk.Button(self.controls, bg='#4D1C00', fg='white', font=10)
  66.         self.loadSongs['text'] = 'Buscar músicas'
  67.         self.loadSongs['command'] = self.retrieve_songs
  68.         self.loadSongs.grid(row=0, column=0, padx=10)
  69.  
  70.         self.prev = tk.Button(self.controls, image=prev)
  71.         self.prev['command'] = self.prev_song
  72.         self.prev.grid(row=0, column=1)
  73.  
  74.         self.pause = tk.Button(self.controls, image=pause)
  75.         self.pause['command'] = self.pause_song
  76.         self.pause.grid(row=0, column=2)
  77.  
  78.         self.next = tk.Button(self.controls, image=next_)
  79.         self.next['command'] = self.next_song
  80.         self.next.grid(row=0, column=3)
  81.  
  82.         self.volume = tk.DoubleVar(self)
  83.         self.slider = tk.Scale(self.controls, from_ = 0, to = 10, orient = tk.HORIZONTAL)
  84.         self.slider['variable'] = self.volume
  85.         self.slider.set(8)
  86.         mixer.music.set_volume(0.8)
  87.         self.slider['command'] = self.change_volume
  88.         self.slider.grid(row=0, column=4, padx=5)
  89.  
  90.  
  91.     def tracklist_widgets(self):
  92.         self.scrollbar = tk.Scrollbar(self.tracklist, orient=tk.VERTICAL)
  93.         self.scrollbar.grid(row=0,column=1, rowspan=5, sticky='ns')
  94.  
  95.         self.list = tk.Listbox(self.tracklist, selectmode=tk.SINGLE,
  96.                      yscrollcommand=self.scrollbar.set, selectbackground='#4D1C00')
  97.         self.enumerate_songs()
  98.         self.list.config(height=22)
  99.         self.list.bind('<Double-1>', self.play_song)
  100.  
  101.         self.scrollbar.config(command=self.list.yview)
  102.         self.list.grid(row=0, column=0, rowspan=5)
  103.  
  104.     def retrieve_songs(self):
  105.         self.songlist = []
  106.         directory = filedialog.askdirectory()
  107.         for root_, dirs, files in os.walk(directory):
  108.                 for file in files:
  109.                     if os.path.splitext(file)[1] == '.mp3':
  110.                         path = (root_ + '/' + file).replace('\\','/')
  111.                         self.songlist.append(path)
  112.  
  113.         with open('songs.pickle', 'wb') as f:
  114.             pickle.dump(self.songlist, f)
  115.         self.playlist = self.songlist
  116.         self.tracklist['text'] = f'PlayList - {str(len(self.playlist))}'
  117.         self.list.delete(0, tk.END)
  118.         self.enumerate_songs()
  119.  
  120.     def enumerate_songs(self):
  121.         for index, song in enumerate(self.playlist):
  122.             self.list.insert(index, os.path.basename(song))
  123.  
  124.     def play_pause_song(self, event):
  125.         if self.paused:
  126.             self.play_song()
  127.         else:
  128.             self.pause_song()
  129.  
  130.     def play_song(self, event=None):
  131.         if event is not None:
  132.             self.current = self.list.curselection()[0]
  133.             for i in range(len(self.playlist)):
  134.                 self.list.itemconfigure(i, bg="white")
  135.  
  136.         print(self.playlist[self.current])
  137.         mixer.music.load(self.playlist[self.current])
  138.         self.songtrack['anchor'] = 'w'
  139.         self.songtrack['text'] = os.path.basename(self.playlist[self.current])
  140.  
  141.         self.pause['image'] = play
  142.         self.paused = False
  143.         self.played = True
  144.         self.list.activate(self.current)
  145.         self.list.itemconfigure(self.current, bg='sky blue')
  146.  
  147.         mixer.music.play()
  148.  
  149.     def pause_song(self):
  150.         if not self.paused:
  151.             self.paused = True
  152.             mixer.music.pause()
  153.             self.pause['image'] = pause
  154.         else:
  155.             if self.played == False:
  156.                 self.play_song()
  157.             self.paused = False
  158.             mixer.music.unpause()
  159.             self.pause['image'] = play
  160.  
  161.     def prev_song(self, event=None):
  162.         self.master.focus_set()
  163.         if self.current > 0:
  164.             self.current -= 1
  165.         else:
  166.             self.current = 0
  167.         self.list.itemconfigure(self.current + 1, bg='white')
  168.         self.play_song()
  169.  
  170.     def next_song(self, event=None):
  171.         self.master.focus_set()
  172.         if self.current < len(self.playlist) - 1:
  173.             self.current += 1
  174.         else:
  175.             self.current = 0
  176.         self.list.itemconfigure(self.current - 1, bg='white')
  177.         self.play_song()
  178.  
  179.     def change_volume(self, event=None):
  180.         self.v = self.volume.get()
  181.         mixer.music.set_volume(self.v / 10)
  182.  
  183. # ----------------------------- Main -------------------------------------------
  184.  
  185. if __name__ == '__main__':
  186.     root = tk.Tk()
  187.     root.geometry('600x400+433+234')
  188.     root.title('Player de músicas')
  189.     root.resizable(False, False)
  190.     root.iconbitmap('icons/musica.ico')
  191.     root.config(bg='#EC9A02')
  192.  
  193.     img = PhotoImage(file='icons/fundo.gif')
  194.     next_ = PhotoImage(file = 'icons/proximo.gif')
  195.     prev = PhotoImage(file='icons/anterior.gif')
  196.     play = PhotoImage(file='icons/toca.gif')
  197.     pause = PhotoImage(file='icons/pausa.gif')
  198.  
  199.     app = Player(master=root)
  200.     app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement