[Python-Tkinter] EasyMp3Edit
Página 1 de 1.
[Python-Tkinter] EasyMp3Edit
Este es un editor de informacion de etiquetas mp3 que hice.
Saludos!
- Código:
# -*- coding: cp1252 -*-
from Tkinter import *
from tkFileDialog import askopenfilename
from tkMessageBox import showerror, showwarning
from tkFont import Font
from mutagen.mp3 import EasyMP3 as MP3
from os.path import getsize, exists, splitdrive
from sys import argv
from platform import system as OS_NAME
MIDISCO = splitdrive(argv[0])[0]+"\\"
TiposMode = ["Stereo", "Joint Stereo", "DualChannel", "Mono"]#0-3
def GetSizeToString(bytes):
#Pasa los bytes 7589108 a 7.23Mb
Mb = str(bytes / 1024.0 / 1024.0)
if "." in Mb: cifra1, cifra2 = Mb.split(".")
else: cifra1, cifra2 = Mb, "0"
tamanio = (cifra1 if int(cifra1) < 1024 else str(int(cifra1)/1000))+"."+(cifra2[:2] if len(cifra2) > 1 else cifra2[0])+("Mb" if int(cifra1) < 1024 else "Gb")
return tamanio
def GetTimerString(inSegs):
"""enconvert segs 377 to 06:17
>>> GetTimeNormalTrack(3600) #1 HS
1:00:00"""
hours = 0
mins = 0
segs = 0
for i in range(int(inSegs)):
segs += 1
if segs > 59:
segs = 0
mins += 1
if mins > 59:
mins = 0
hours += 1
return (str(hours)+":" if hours != 0 else "")+(str(mins) if mins > 9 else "0"+str(mins))+":"+(str(segs) if segs > 9 else "0"+str(segs))
def ArchivoErrorBox(file):
showerror("Error", 'El archivo "'+file+'" no funciona en EasyTagEdit')
class Body:
def __init__(self):
self.ventana = Tk()
self.ventana.geometry("440x330")
self.ventana.title('EasyMp3Edit - presiona el boton "Abrir nuevo"')
self.ventana.resizable(False, False)
icono = "EasyTagEdit."+("ico" if OS_NAME() == "Windows" else "png")
try:
self.ventana.iconbitmap(icono)
ERROR_ICON = False
except:
ERROR_ICON = True
#MENU TOP
self.BaseMenus = LabelFrame(self.ventana, bg = "gray60", relief = "raised")
self.BaseMenus.pack(side = TOP, fill = X)
self.Boton_Menu_Archivo = Menubutton(self.BaseMenus, text = "Archivo", bg = "gray65", fg = "white", activebackground = "gray70", activeforeground = "white")
self.Boton_Menu_Archivo.pack(side = LEFT)
self.Menu_Archivo = Menu(self.Boton_Menu_Archivo, tearoff = False, bg = "gray65", fg = "white", activebackground = "gray90", activeforeground = "black")
self.Menu_Archivo.add_command(label="Abrir nuevo MP3", command=self.AbrirArchivoMp3)
self.Menu_Archivo.add_command(label="Cerrar MP3", state="disable", command=self.CerrarMp3)
self.Menu_Archivo.add_command(label="Guardar", state="disable", command=self.GuardarActualEnActual)
self.Menu_Archivo.add_command(label="Guardar en", state="disable", command=self.GuardarMp3Tag)
self.Boton_Menu_Archivo["menu"] = self.Menu_Archivo
self.Boton_Menu_Ayuda = Menubutton(self.BaseMenus, text = "Ayuda", bg = "gray65", fg = "white", activebackground = "gray70", activeforeground = "white")
self.Boton_Menu_Ayuda.pack(side = LEFT)
self.Menu_Ayuda = Menu(self.Boton_Menu_Ayuda, tearoff = False, bg = "gray65", fg = "white", activebackground = "gray90", activeforeground = "black")
self.Menu_Ayuda.add_command(label="Acerca de...", command=self.AcercaDE)
self.Boton_Menu_Ayuda["menu"] = self.Menu_Ayuda
fontSpecial = Font(size=8, weight="bold")
self.fondo = Canvas(self.ventana, bg="gray80", highlightbackground = "gray70")
self.fondo.place(x=0, y=30, width=440, height=300)
self.fondo.create_line(8,6, 430,6, fill="#000000")
self.fondo.create_line(8,294, 430,294, fill="#000000")
for i in range(10,290,5):
self.fondo.create_text(7, i, fill="#FFFFFF", text="..", font=fontSpecial)
self.fondo.create_text(431, i, fill="#FFFFFF", text="..", font=fontSpecial)
self.BotonAbrirNuevo = Button(self.ventana, font=fontSpecial, bg="gray70", activebackground="gray60", fg="#222222", activeforeground="#222222", text="Abrir nuevo", underline=0, command=self.AbrirArchivoMp3)
self.BotonAbrirNuevo.place(x=15, y=40, width=80, height=40)
self.BotonCerrarActual = Button(self.ventana, font=fontSpecial, bg="gray70", activebackground="gray60", fg="#222222", activeforeground="#222222", state="disabled", text="Cerrar mp3", underline=0, command=self.CerrarMp3)
self.BotonCerrarActual.place(x=97, y=40, width=80, height=40)
self.BotonGuardar = Button(self.ventana, font=fontSpecial, bg="gray70", activebackground="gray60", fg="#222222", activeforeground="#222222", state="disabled", text="Guardar", underline=0, command=self.GuardarActualEnActual)
self.BotonGuardar.place(x=179, y=40, width=80, height=40)
self.BotonGuardarActualEn = Button(self.ventana, font=fontSpecial, bg="gray70", activebackground="gray60", fg="#222222", activeforeground="#222222", state="disabled", text="Guardar en", underline=0, command=self.GuardarMp3Tag)
self.BotonGuardarActualEn.place(x=261, y=40, width=80, height=40)
self.BotonAcercaDe = Button(self.ventana, font=fontSpecial, bg="gray70", activebackground="gray60", fg="#222222", activeforeground="#222222", text="Acerca de...", underline=0, command=self.AcercaDE)
self.BotonAcercaDe.place(x=343, y=40, width=80, height=40)
self.fondo.create_line(20,54, 418,54, fill="#000000")
#########InfoTrack#########
self.MarcoInfo = LabelFrame(self.ventana, bg="gray80", font=fontSpecial, text="Info MP3", fg="#000000", relief="groove")
self.MarcoInfo.place(x=20, y=90, width=398, height=75)
self.InfoDuracion = Label(self.MarcoInfo, bg="gray80", font=fontSpecial, text="Duracion:", fg="#472F13")
self.InfoDuracion.place(x=10, y=0)
self.InfoTamanyo = Label(self.MarcoInfo, bg="gray80", font=fontSpecial, text="Tamaño en disco:", fg="#472F13")
self.InfoTamanyo.place(x=10, y=17)
self.InfoCalidad = Label(self.MarcoInfo, bg="gray80", font=fontSpecial, text="Calidad:", fg="#472F13")
self.InfoCalidad.place(x=10, y=34)
#########InputInfoTrack########
self.MarcoInputInfo = LabelFrame(self.ventana, bg="gray80", font=fontSpecial, text="Edit Info MP3", fg="#000000", relief="groove")
self.MarcoInputInfo.place(x=20, y=170, width=398, height=145)
Label(self.MarcoInputInfo, bg="gray80", text="Titulo:", fg="#000000").place(x=5, y=5)
self.TituloInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.TituloInput.place(x=55, y=5, width=330)
Label(self.MarcoInputInfo, bg="gray80", text="Artista:", fg="#000000").place(x=5, y=27)
self.ArtistaInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.ArtistaInput.place(x=55, y=27, width=330)
Label(self.MarcoInputInfo, bg="gray80", text="Album:", fg="#000000").place(x=5, y=49)
self.AlbumInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.AlbumInput.place(x=55, y=49, width=130)
Label(self.MarcoInputInfo, bg="gray80", text="Año:", fg="#000000").place(x=190, y=49)
self.AnyoInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.AnyoInput.place(x=230, y=49, width=85)
Label(self.MarcoInputInfo, bg="gray80", text="Pista:", fg="#000000").place(x=315, y=49)
self.PistaInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.PistaInput.place(x=350, y=49, width=35)
Label(self.MarcoInputInfo, bg="gray80", text="Genero:", fg="#000000").place(x=5, y=71)
self.GeneroInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.GeneroInput.place(x=55, y=71, width=130)
Label(self.MarcoInputInfo, bg="gray80", text="Grupo:", fg="#000000").place(x=190, y=71)
self.GrupoInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.GrupoInput.place(x=230, y=71, width=155)
Label(self.MarcoInputInfo, bg="gray80", text="Copyright:", fg="#000000").place(x=2, y=93)
self.DerechosInput = Entry(self.MarcoInputInfo, bg="#FFFFFF", fg="#000000", state="disabled", relief="groove", disabledbackground="#FFFFFF")
self.DerechosInput.place(x=55, y=93, width=330)
self.TodasEntradas = (self.TituloInput, self.ArtistaInput, self.AlbumInput, self.AnyoInput, self.PistaInput, self.GeneroInput, self.GrupoInput, self.DerechosInput)
#Sistema del archivo MP3:
self.FileNameMp3 = ""
#Chequeos:
def ShowErrorIcon():
if exists(icono):
error = "'"+icono+"' es un icono corrupto, los iconos se deben hacer con programas echos para crear iconos."
else:
error = "'"+icono+"' no se encuentra"
showwarning("EasyTagEdit - error en icono", error)
if ERROR_ICON: self.ventana.after(2000, ShowErrorIcon)
if len(argv) > 1: self.ventana.after(1000, self.AbrirArchivoArgumentado)
def CerrarMp3(self):
self.LimpiarDatos()
for objeto in (self.BotonCerrarActual, self.BotonGuardar, self.BotonGuardarActualEn)+self.TodasEntradas:
objeto["state"] = "disable"
def GuardarMp3Tag(self, FILE=None):
if not FILE:
file = askopenfilename(title="Abrir un archivo MP3", initialdir=MIDISCO, filetypes = (("Sound","*.mp3"),))
else:
file = FILE
if file:
try:
self.FileNameMp3 = file
Tag = MP3(self.FileNameMp3)
Tag["title"] = self.TituloInput.get()
Tag["artist"] = self.ArtistaInput.get()
Tag["album"] = self.AlbumInput.get()
Tag["date"] = self.AnyoInput.get()
Tag["tracknumber"] = self.PistaInput.get()
Tag["genre"] = self.GeneroInput.get()
Tag["performer"] = self.GrupoInput.get()
Tag["copyright"] = self.DerechosInput.get()
Tag.save()
except:
ArchivoErrorBox(file)
def GuardarActualEnActual(self):
self.GuardarMp3Tag(self.FileNameMp3)
def LimpiarDatos(self):
self.FileNameMp3 = ""
for entrada in self.TodasEntradas:
entrada.delete(0, "end")
self.InfoDuracion["text"] = "Duracion:"
self.InfoTamanyo["text"] = "Tamaño en disco:"
self.InfoCalidad["text"] = "Calidad:"
for menu in range(1,5):
self.Menu_Archivo.entryconfigure(menu, state="disable")
def AbrirArchivoMp3(self, FILE=None):
if not FILE:
file = askopenfilename(title="Abrir un archivo MP3", initialdir=MIDISCO, filetypes = (("Sound","*.mp3"),))
else:
file = FILE
if file:
try:
self.LimpiarDatos()
self.FileNameMp3 = file
Tag = MP3(self.FileNameMp3)
TagInfo = Tag.info
anyo = Tag["date"][0] if Tag.has_key("date") else ""
pista = Tag["tracknumber"][0] if Tag.has_key("tracknumber") else ""
grupo = Tag["performer"][0] if Tag.has_key("performer") else ""
compositor = Tag["composer"][0] if Tag.has_key("composer") else ""
album = Tag["album"][0] if Tag.has_key("album") else ""
derechos = Tag["copyright"][0] if Tag.has_key("copyright") else ""
genero = Tag["genre"][0] if Tag.has_key("genre") else ""
artista = Tag["artist"][0] if Tag.has_key("artist") else ""
titulo = Tag["title"][0] if Tag.has_key("title") else ""
segs = TagInfo.length
self.InfoDuracion["text"] = "Duracion: "+GetTimerString(int(segs))+" - segs: "+str(segs)
self.InfoTamanyo["text"] = "Tamaño en disco: "+GetSizeToString(getsize(file))
self.InfoCalidad["text"] = "Calidad: "+str(TagInfo.sample_rate/1000)+"kHz, "+str(TagInfo.bitrate/1000)+"kbps, "+TiposMode[TagInfo.mode]
for objeto in (self.BotonCerrarActual, self.BotonGuardar, self.BotonGuardarActualEn)+self.TodasEntradas:
objeto["state"] = "normal"
for menu in range(1,5):
self.Menu_Archivo.entryconfigure(menu, state="normal")
self.TituloInput.insert(0, titulo)
self.ArtistaInput.insert(0, artista)
self.AlbumInput.insert(0, album)
self.AnyoInput.insert(0, anyo)
self.PistaInput.insert(0, pista)
self.GeneroInput.insert(0, genero)
self.GrupoInput.insert(0, grupo)
self.DerechosInput.insert(0, derechos)
except:
self.LimpiarDatos()
for objeto in (self.BotonCerrarActual, self.BotonGuardar, self.BotonGuardarActualEn)+self.TodasEntradas:
objeto["state"] = "disabled"
ArchivoErrorBox(file)
self.ventana.title('EasyMp3Edit')
def AbrirArchivoArgumentado(self):
self.AbrirArchivoMp3(argv[1])
def AcercaDE(self):
GEOMETRY = tuple([int(str)+40 for str in self.ventana.geometry().split("+")[1:]])
ventanaAcercaDE = Tk()
ventanaAcercaDE.geometry("250x250+%d+%d" % GEOMETRY)
ventanaAcercaDE.title("Acerca de EasyMp3Edit")
ventanaAcercaDE.resizable(False, False)
icono = "EasyTagEdit."+("ico" if OS_NAME() == "Windows" else "png")
try:
ventanaAcercaDE.iconbitmap(icono)
except: pass
Frame(ventanaAcercaDE, bg="gray10").place(x=0, y=0, width=250, height=250)
Texto = Text(ventanaAcercaDE, bg="gray90", fg="#000000")
Texto.place(x=5,y=5, width=240, height=240)
Texto.insert("0.0", "Version: 1.0\nLenguaje de programacion usado: Python 2.5.0\nCreador: Leonardo A. Reichert\nFecha: 2011\nModulos usados con Python:\n Tkinter\n tkFileDialog\n tkMessageBox\n tkFont\n mutagen.mp3\n os.path\n sys\n platform\n\nPara la linea de comandos usa:\n C:\\EasyTagEdit.py archivo.mp3\n\nGracias por usar EasyMp3Edit")
Texto["state"] = "disabled"
Machine = Body()
Machine.ventana.mainloop()
Saludos!
Sokoleonardo- Moderador de Seccion
- Mensajes : 52
Nivel : 138
Reputación : 4
Fecha de inscripción : 04/08/2011
Vive en : Argentina
Temas similares
» [Tkinter Python]CUH-F1Sound 1.0.0(Reproductor de *.mp3 en Python)By Sokoleonardo
» [Python] Tutorial (Python para todos) Por Raúl González Duque
» Crear menus profecionales en Tkinter. by Sokoleonardo
» [Python] Tutorial (Python para todos) Por Raúl González Duque
» Crear menus profecionales en Tkinter. by Sokoleonardo
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
Vie Sep 05, 2014 6:15 pm por JAVIER_77
» Hacker nostale
Vie Jul 20, 2012 5:02 pm por Sweet_Boy
» Chrome OS 20.x pasa al canal estable
Vie Jul 13, 2012 11:15 pm por [D]ement<<<
» Disponible openSUSE 12.2 RC 1
Vie Jul 13, 2012 12:44 am por [D]ement<<<
» NitroShare, comparte archivos y carpetas entre Linux y Windows
Vie Jul 13, 2012 12:26 am por [D]ement<<<
» Linux Mint 13 KDE Release Candidate, disponible
Vie Jul 13, 2012 12:18 am por [D]ement<<<
» LibreOffice 3.5.5, más estabilidad
Vie Jul 13, 2012 12:06 am por [D]ement<<<
» File History, un Time Machine para Windows 8
Miér Jul 11, 2012 9:50 pm por [D]ement<<<
» Como habilitar el logueo automático en Windows
Miér Jul 11, 2012 9:44 pm por [D]ement<<<
» Acronis True Image 2012
Mar Jul 10, 2012 12:15 am por [D]ement<<<
» Virus Informaticos
Mar Mayo 08, 2012 7:10 am por Sokoleonardo