Exemplo n.º 1
0
class Player(Frame):
	def __init__(self,master):
		super().__init__(master)
		self.master =master
		mixer.init()
		self.pack()
		if os.path.exists("tracks.pickle"):
			with open ("tracks.pickle", "rb") as f:
				self.playlist =pickle.load(f)
		else:
			self.playlist =[]

		# player state flags
		self.track_index =0
		self.track_paused =True
		self.track_played =False

		self.model_frame()
		self.track_widget()
		self.tracklist_widget()
		self.controls_widget()

	# frames
	def model_frame(self):
		self.track =LabelFrame(self,
				relief =GROOVE
			)
		self.track.configure(
				width =410,
				height =300
			)
		self.track.grid(row=0, column=0,pady=10,padx=10)

		self.tracklist =LabelFrame(self,
				relief =GROOVE
			)
		self.tracklist.configure(
				width =190,
				height =420
			)
		self.tracklist.grid(row=0, column=1,rowspan=3,pady=10,padx=10)

		self.controls =LabelFrame(self,
				font =("times new roman",15,"bold"),
				bg ="white",
				fg ="white",
				bd =0,
				relief =GROOVE
			)
		self.controls.configure(
				width =410,
				height =100
			)
		self.controls.grid(row=1, column=0,pady=10,padx=10)

	# widgets
	def track_widget(self):
		self.canvas =Label(self.track,font =("times new roman",15,"bold"),bg="white", fg ="dodgerblue")
		self.canvas['text'] ="Hit tracks"; 
		self.canvas.configure(width =33, height =1)
		self.canvas.grid(row =0,column =0)

		self.canvas =Label(self.track,image=track_ico) 
		self.canvas.configure(width =300, height =240)
		self.canvas.grid(row =1,column =0)

		self.playing_tune =Label(self.track,font =("Calibri",13),bg="white", fg ="dodgerblue")
		self.playing_tune['text'] ="Musiflix MP3 Player"; 
		self.playing_tune.configure(width =44, height =1)
		self.playing_tune.grid(row =2,column =0)

	def tracklist_widget(self):
		self.listtitle =Label(self.tracklist,font =("times new roman",15,"bold"),bg="white", fg ="dodgerblue")
		self.listtitle['text'] =f"Playlist:  {len(self.playlist)} "
		self.listtitle.configure(width =10, height =1)
		self.listtitle.grid(row =0,column =0)

		self.scrollbar =Scrollbar(self.tracklist,orient =VERTICAL)
		self.scrollbar.grid(row=0, column=1,rowspan =10, sticky="NS")

		self.list =Listbox(self.tracklist, selectmode =SINGLE,
			yscrollcommand =self.scrollbar.set, selectbackground ="sky blue")
		self.track_listing()
		self.list.config(height =22)
		self.list.bind('<Double-1>', self.play_track)
		self.scrollbar.config(command =self.list.yview)
		self.list.grid(row=2, column=0, rowspan =5)

	def track_listing(self):
		for index, track in enumerate(self.playlist):
			self.list.insert(index,os.path.basename(track))

	def controls_widget(self):
		self.tracklister =Button(self.controls, 
			font =("times new roman",15,"bold"),
			bg="white", fg ="dodgerblue", padx =10,pady =5,
			command =self.select_track
			)
		self.tracklister['text'] ="Load tracks"
		self.tracklister.grid(row =0,column =0,padx=10,pady =5)

		self.prevbutton =Button(self.controls,image =prev_icon, command =self.prev_track)
		self.prevbutton.grid(row =0,column =1,pady =5)

		self.pausebutton =Button(self.controls,image =pauseicon, command =self.pause_track)
		self.pausebutton.grid(row =0,column =2,pady =5)

		self.nextbutton =Button(self.controls,image =next_icon, command =self.next_track)
		self.nextbutton.grid(row =0,column =3,pady =5)

		self.volume =DoubleVar()
		self.slider =Scale(self.controls, from_ =0, to =10, orient =HORIZONTAL)
		self.slider['variable'] =self.volume
		self.slider['command'] =self.change_volume
		self.slider.set(3)
		mixer.music.set_volume(0.3)
		self.slider.grid(row =0, column=4,padx=10,pady =5)

	def change_volume(self, event =None):
		self.v =self.volume.get()
		mixer.music.set_volume(self.v/10)


	def select_track(self):
		self.tunes =[]
		directory =filedialog.askdirectory()
		for rooot, dirs, files in os.walk(directory):
			for file in files:
				if os.path.splitext(file)[1] =='.mp3':
					path =(rooot + '/' + file).replace('\\','/')
					self.tunes.append(path)
		with open("tracks.pickle", "wb") as f:
			pickle.dump(self.tunes, f) 
		self.playlist =self.tunes
		self.listtitle['text'] =f"Playlist:  {len(self.playlist)}"
		self.list.delete(0, END)
		self.track_listing()

	def play_track(self, event =None):
		try:
			if event is not None:
				self.track_index =self.list.curselection()[0]
			for i in range(len(self.playlist)):
				self.list.itemconfigure(i,bg="white",fg="black")
			mixer.music.load(self.playlist[self.track_index])
			self.track_paused =False
			self.track_played =True
			self.pausebutton['image'] =playicon
			self.playing_tune.anchor('w')
			self.playing_tune['text'] =os.path.basename(self.playlist[self.track_index])
			self.list.activate(self.track_index)
			self.list.itemconfigure(self.track_index,bg="teal", fg="white")
			mixer.music.play()
		except  Exception as e:
			pass
	def pause_track(self):
		if not self.track_paused:
			try:
				self.track_paused =True
				self.pausebutton['image'] =pauseicon
				mixer.music.pause()
			except Exception as e:
				pass
		else:
			try:
				if not self.track_played:
					self.play_track()
				self.track_paused =False
				self.pausebutton['image'] =playicon
				mixer.music.unpause()
			except Exception as e:
				pass
	def next_track(self):
		if self.track_index > len(self.playlist) -1:
			self.track_index =0
		self.track_index +=1
		self.play_track()

	def prev_track(self):
		if self.track_index < 0:
			self.track_index =len(self.playlist) -1
		self.track_index -=1
		self.play_track()