Mayo 24, 2018, 05:42:27 am

Autor Tema: [Tkinter Python]CUH-F1Sound 1.0.0(Reproductor de *.mp3 en Python)By Sokoleonardo  (Leído 2746 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Sokoleonardo

  • Me das tu IP?
  • *
  • Mensajes: 36
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Tube que fucionar la aplicacion (unir la ventana de "lista de reproduccion" con la ventana principal porque me saltaba errores en las librerias Visual C.

Este reproductor te da 9 listas para agregar musica y cambiar de lista para escuchar una diferente xD



#USE IN PYTHON 2.5.0
#Requiere PyWin32
#Numpy
#PyAudiere
#mutagen-1.20
#eyeD3-0.6.17

Código: You are not allowed to view links. Register or Login
# -*- coding: utf-8 -*-
#CUH-F1Sound By Sokoleonardo
from Tkinter import *
from tkFont import Font
from sys import argv
from glob import glob
from tkFileDialog import askopenfilenames, askopenfilename, askdirectory
from tkMessageBox import showwarning, showerror
from os.path import splitext, getsize, splitdrive, exists
from os import getcwd
from eyeD3 import Mp3AudioFile
from mutagen.mp3 import EasyMP3, MPEGInfo
from time import clock
from random import randrange
from re import split
from cPickle import dump, load
from platform import system as OperatingSystem
try: from audiere import open_device
except: from audiere import open_device #pyaudiere falla al ser compilado a *.exe

    #USE IN PYTHON 2.5.0
    #Requiere PyWin32
    #Numpy
    #PyAudiere
    #mutagen-1.20
    #eyeD3-0.6.17

OpenerAudio = open_device()

if not exists("SAVE.CUH-F1Sound"):
    #Estos datos deben existir en un archivo (datos por defecto)
    FILE = open("SAVE.CUH-F1Sound", "w")
    dump([[40,100,0], [0,1,0], [[],[],[],[],[],[],[],[],[]], ["1",0], "600x375+230+230", 0], FILE)
    FILE.close()
    # ->> [volume, tone, balanc], [buttonCheck1,buttonCheck2, buttonCheck3], [listadosDirS], [listSeleccionada, trackActual], [geometryWindow], [intposttrack]

def EyeD3Data(filename):
    tag = Mp3AudioFile(filename)
    cifra1, cifra2 = str(getsize(filename) / 1024.0 / 1024.0).split(".")
    MB = cifra1+"." + (cifra2[1] if len(cifra2) < 2 else cifra2[:2]) + "MB"
    Freq = str(tag.getSampleFreq()/1000)+"KHz"
    return tag.getPlayTime(), tag.getBitRateString(), Freq, MB, tag.getPlayTimeString()

def MutagenData(filename):
    try:
        tag = EasyMP3(filename)
        artista = tag["artist"][0] if tag.has_key("artist") else "N/A" #0
        titulo = tag["title"][0] if tag.has_key("title") else "N/A"    #1
        NameTrack = artista+" - "+titulo if artista!="N/A" and titulo!="N/A" else splitext(split("[\\\/]", filename)[-1])[0]#2
        album = tag["album"][0] if tag.has_key("album") else "N/A"     #3
        genero = tag["genre"][0] if tag.has_key("genre") else "N/A"    #4
        anyo = tag["date"][0] if tag.has_key("date") else "N/A"        #5
        return artista, titulo, NameTrack, album, genero, anyo
    except: return ("Error",) * 6

def GetTimeNormalTrack(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 LightButton(button, colorON, colorOFF):
    def ON(*e):
        button["bg"] = colorON
    button.bind("<Enter>", ON)
    def OFF(*e):
        button["bg"] = colorOFF
    button.bind("<Leave>", OFF)

def LauncherError(FileFail):
    textError = '''
Se produjo un error dado las siguientes posibilidades:
    1 - El archivo ya no existe.
    2 - El nombre del archivo contiene caracteres como: Ññ´. etc.
    3 - El archivo no puede ser leido por PyAudiere.
    4 - El archivo es corrupto o vacio.
Porfavor abra otro *.mp3 y no el archivo:
    "'''+FileFail+'"\n\nGracias.'
    showwarning("Error en CUH-F1Sound", textError)

class ListReproductions:
    """Methods of List Right"""

    def ActualizationSizeWin(self):
        listaDir = eval("self.List"+self.ListSelectActual)
        if listaDir:
            cantidad = str(len(listaDir))
            tamanyo = 0
            for bytes in [getsize(mp3) for mp3 in listaDir]:
                tamanyo += bytes
            segundos = 0
            for segs in [EyeD3Data(mp3)[0] for mp3 in listaDir]:
                segundos += segs
            duracion = GetTimeNormalTrack(segundos)
            cifra1, cifra2 = str(tamanyo / 1024.0 / 1024.0).split(".")
            TamanioMemoria = ("MB: " if int(cifra1) < 1000 else "GB: ")+(cifra1 if int(cifra1) < 1000 else str(int(cifra1)/1000))+"." + (cifra2[0] if len(cifra2) < 2 else cifra2[:2])
            self.ResultSizeList["text"] = "Pistas: "+str(cantidad)+", "+TamanioMemoria+", Duracion: "+duracion
        else:
                self.ResultSizeList["text"] = "Pistas: 0, MB: 0.00, Duracion: 00:00"

    def ActivateTrackInList(self, *e):
        select = self.ListTracks.curselection()
        if len(select) == 1:
            if self.SelectActualTrack[1] == self.ListSelectActual:
                self.ListTracks.itemconfig(self.SelectActualTrack[0], fg="red")
            self.ListTracks.itemconfig(select, fg="#009600")
            self.SelectActualTrack = [int(select[0]), self.ListSelectActual]
            self.RenameSound(1)

    def ActualizationTaggerReport(self, *e):
        FileSelect = eval("self.List"+self.ListSelectActual)[int(self.SelectActualTrack[0])]
        Dates = MutagenData(FileSelect)
        DatesTamanyo = EyeD3Data(FileSelect)
        self.TituloDeNombre["text"] = "Grupo: "+Dates[0]
        self.TituloDeCancion["text"] = "Cancion: "+Dates[1]
        self.TituloDeAlbum["text"] = "Album: "+Dates[3]
        self.TituloDeGenero["text"] = "Genero: "+Dates[4]
        self.TituloAnyo["text"] = "Edad: "+Dates[5]
        self.TituloTamanyos["text"] = "Tamaños: "+str(DatesTamanyo[4])+", "+str(DatesTamanyo[1])+", "+DatesTamanyo[2]+", "+str(DatesTamanyo[3])
        FILEOBJ = file(FileSelect)
        self.ventana.title("CUH-F1Sound :: "+MPEGInfo(FILEOBJ).pprint())
        FILEOBJ.close()

    def Change(self, numL):
        ColorListaDejada = eval("self.List"+self.ListSelectActual+"_Button")
        ColorListaDejada["fg"] = "black"
        self.ListTracks.delete(0, "end")
        self.ListSelectActual = numL
        numTrack = 1
        for track in eval("self.List"+numL):
            self.ListTracks.insert("end", str(numTrack)+" - "+MutagenData(track)[2])
            numTrack+=1
        ColorListaActual = eval("self.List"+numL+"_Button")
        ColorListaActual["fg"] = "#009600"
        if self.SelectActualTrack[1] == numL and self.ListTracks.size():
                self.ListTracks.itemconfig(int(self.SelectActualTrack[0]), fg="#009600")
        self.ActualizationSizeWin()
    def ChangeL1(self):
        self.Change("1")
    def ChangeL2(self):
        self.Change("2")
    def ChangeL3(self):
        self.Change("3")
    def ChangeL4(self):
        self.Change("4")
    def ChangeL5(self):
        self.Change("5")
    def ChangeL6(self):
        self.Change("6")
    def ChangeL7(self):
        self.Change("7")
    def ChangeL8(self):
        self.Change("8")
    def ChangeL9(self):
        self.Change("9")

    def RemoveSoundSelect(self, *e):
        """Remove pistas de la lista (1 o mas dependiendo de la cantidad seleccionada)"""
        select = list(self.ListTracks.curselection())
        if select:
            self.ListTracks.delete(select[0], select[-1])
            select.reverse()
            for index in select:
                del eval("self.List"+self.ListSelectActual)[int(index)]
                if int(index) < self.SelectActualTrack[0]:
                    self.SelectActualTrack[0] -= 1
            self.Change(self.ListSelectActual)
            self.ActualizationSizeWin()

    def RemoveSoundDouble(self, *e):
        """Elimina los sonidos repetidos en la lista"""
        List = list(set(eval("self.List"+self.ListSelectActual)))
        diference =  eval("self.List"+self.ListSelectActual).__len__() - List.__len__()
        self.ListTracks.delete(0,"end")
        del eval("self.List"+self.ListSelectActual)[0:]
        for track in List:
            eval("self.List"+self.ListSelectActual).append(track)
        self.SelectActualTrack[0] -= diference
        if self.SelectActualTrack[0] < 0: self.SelectActualTrack[0] = 0
        self.Change(self.ListSelectActual)
        self.ActualizationSizeWin()

    def RemoveAllSounds(self):
        self.ListTracks.delete(0,"end")
        del eval("self.List"+self.ListSelectActual)[0:]
        self.ActualizationSizeWin()

#####LOAD#####
FILE = open("SAVE.CUH-F1Sound", "r")
DATA_SAVE = load(FILE)
DATA_SCALES = DATA_SAVE[0]
DATA_BUTTONS = DATA_SAVE[1]
DATA_LISTS = DATA_SAVE[2]
DATA_SELECTS = DATA_SAVE[3]
DATA_GEOMETRY = DATA_SAVE[4]
DATA_POSITION_TRACK = DATA_SAVE[5]
FILE.close()
###END_LOAD###

class Body_Master(ListReproductions):
    def __init__(self):
        self.ventana = Tk()
        self.ventana.geometry(DATA_GEOMETRY)
        self.ventana.title("CUH-F1Sound :: Teclea F1 para informacion")
        self.ventana.resizable(False, False)
        fontSpecial = Font(size=8, weight="bold")
        fontTitles = Font(size=10, weight="bold", underline=True)
        icon = "iconHeavy"+(".ico" if OperatingSystem() == "Windows" else ".png")
        try:
            self.ventana.iconbitmap(icon)
            ICON_ERROR = False
        except: ICON_ERROR = True
        self.GeometryWin = self.ventana.geometry()
        self.Track = None
        self.BoolMovePosition = False
        self.fondo = Frame(self.ventana, bg="gray70", width=300, height=375)
        self.fondo.place(x=0, y=0)
        self.MarcoBotonesClip = Frame(self.fondo, bg="gray80", width=300, height=50)
        self.MarcoBotonesClip.place(x=0,y=0)
        self.BotonPlay = Button(self.MarcoBotonesClip, bg="gray40", activebackground="gray30", text="►", font=("Lucida","20"), command=self.PlayMP3)
        self.BotonPlay.place(x=0,y=0, width=50, height=50)
        self.BotonPausa = Button(self.MarcoBotonesClip, bg="gray40", activebackground="gray30", text="▌▐", font=("Lucida","20"), command=self.PauseMP3)
        self.BotonPausa.place(x=50,y=0, width=50, height=50)
        self.BotonDetener = Button(self.MarcoBotonesClip, bg="gray40", activebackground="gray30", text="██", font=("Lucida","14"), command=self.StopMP3)
        self.BotonDetener.place(x=100,y=0, width=50, height=50)
        self.BotonPistaArriba = Button(self.MarcoBotonesClip, bg="gray40", activebackground="gray30", text="|▐◄", font=("Lucida","14"), command=self.ChangeTrackUp)
        self.BotonPistaArriba.place(x=150,y=0, width=50, height=50)
        self.BotonPistaAbajo = Button(self.MarcoBotonesClip, bg="gray40", activebackground="gray30", text="►▌|", font=("Lucida","14"), command=self.ChangeTrackDown)
        self.BotonPistaAbajo.place(x=200,y=0, width=50, height=50)
        self.BotonAbrirPistaS = Button(self.MarcoBotonesClip, bg="gray40", activebackground="gray30", text="▲\n▬", font=("Lucida","14"), command=self.OpenSoundsFromDisk)
        self.BotonAbrirPistaS.place(x=250,y=0, width=50, height=50)
        self.ScalaVolumen = Scale(self.fondo, bg="gray50", length=89, highlightbackground="red", showvalue=False, orient="horizontal", repeatinterval=2, tickinterval=50, troughcolor="gray70", activebackground="gray20", sliderlength=15, font=fontSpecial, command=self.ControlVolumen)
        self.ScalaVolumen.place(x=2, y=52, width=97, height=61)
        self.ScalaVolumen.set(DATA_SCALES[0])
        self.ScalaTone = Scale(self.fondo, bg="gray50", length=89, highlightbackground="red", showvalue=False, orient="horizontal", repeatinterval=2, tickinterval=50, troughcolor="gray70", activebackground="gray20", sliderlength=15, font=fontSpecial, command=self.ControlTone)
        self.ScalaTone.place(x=101, y=52, width=97, height=61)
        self.ScalaTone.set(DATA_SCALES[1])
        self.ScalaBalance = Scale(self.fondo, bg="gray50", length=89, highlightbackground="red", showvalue=False, orient="horizontal", repeatinterval=2, tickinterval=100, troughcolor="gray70", activebackground="gray20", sliderlength=15, font=fontSpecial, command=self.ControlBalance)
        self.ScalaBalance.place(x=200, y=52, width=97, height=61)
        self.ScalaBalance["from"] = -100
        self.ScalaBalance["to"] = 100
        self.ScalaBalance.set(DATA_SCALES[2])
        self.ScalaPosicion = Scale(self.fondo, bg="gray50", length=287, highlightbackground="red", showvalue=False, orient="horizontal", repeatinterval=2, troughcolor="gray70", activebackground="gray20", to=0, font=fontSpecial, command=self.ControlPosicion)
        self.ScalaPosicion.place(x=2, y=115, width=295, height=62)
        self.NombreAudio = Label(self.ScalaPosicion, bg="gray50", text=OpenerAudio.name, font=fontSpecial)
        self.NombreAudio.place(x=170, y=38, height=15)
        self.BordeInforme = Frame(self.fondo, bg="red")
        self.BordeInforme.place(x=2, y=179, width=295, height=139)
        self.Informe = Frame(self.fondo, bg="gray50")
        self.Informe.place(x=4, y=181, width=291, height=135)
        self.TituloInforme = Label(self.Informe, bg="gray50", text="Informe", font=fontTitles)
        self.TituloInforme.place(x=110, y=-4, width=70)
        self.TituloDeNombre = Label(self.Informe, bg="gray50", text="Grupo:", font=fontSpecial)
        self.TituloDeNombre.place(x=6, y=15)
        self.TituloDeCancion = Label(self.Informe, bg="gray50", text="Canción:", font=fontSpecial)
        self.TituloDeCancion.place(x=6, y=35)
        self.TituloDeAlbum = Label(self.Informe, bg="gray50", text="Album:", font=fontSpecial)
        self.TituloDeAlbum.place(x=6, y=55)
        self.TituloDeGenero = Label(self.Informe, bg="gray50", text="Genero:", font=fontSpecial)
        self.TituloDeGenero.place(x=6, y=75)
        self.TituloAnyo = Label(self.Informe, bg="gray50", text="Edad:", font=fontSpecial)
        self.TituloAnyo.place(x=6, y=95)
        self.TituloTamanyos = Label(self.Informe, bg="gray50", text="Tamaños:", font=fontSpecial)
        self.TituloTamanyos.place(x=6, y=115)
        self.BordeOpciones = Frame(self.fondo, bg="red", width=295, height=51)
        self.BordeOpciones.place(x=2, y=321)
        self.Opciones = Frame(self.fondo, bg="gray50", width=291, height=47)
        self.Opciones.place(x=4, y=323)
        self.TituloOpciones = Label(self.Opciones, bg="gray50", text="Opciones de pista", font=fontTitles)
        self.TituloOpciones.place(x=85, y=-4, width=120)
        self.IntRepetir = IntVar(value=DATA_BUTTONS[0])
        self.BotonCheckRepeatTrack = Checkbutton(self.Opciones, text="Repetir Pista", bg="gray40", selectcolor="gray70", activebackground="gray60", fg="blue", relief="ridge", variable=self.IntRepetir, command=self.CheckRepeat)
        self.BotonCheckRepeatTrack.place(x=4, y=25, width=85, height=20)
        self.IntChangeAutoDown = IntVar(value=DATA_BUTTONS[1])
        self.BotonCheckChangeAutoDown = Checkbutton(self.Opciones, text="Cambiar Debajo", bg="gray40", selectcolor="gray70", activebackground="gray60", fg="blue", relief="ridge", variable=self.IntChangeAutoDown, command=self.CheckChangeDown)
        self.BotonCheckChangeAutoDown.place(x=91, y=25, width=115, height=20)
        self.IntChangeRandom = IntVar(value=DATA_BUTTONS[2])
        self.BotonCheckChangeRandom = Checkbutton(self.Opciones, text="Cambio rnd", bg="gray40", selectcolor="gray70", activebackground="gray60", fg="blue", relief="ridge", variable=self.IntChangeRandom, command=self.CheckChangeRandom)
        self.BotonCheckChangeRandom.place(x=208, y=25, width=80, height=20)
        for optbutton in (self.BotonCheckRepeatTrack, self.BotonCheckChangeAutoDown, self.BotonCheckChangeRandom):
            LightButton(optbutton, "gray50", "gray40")
        for button in (self.BotonPlay, self.BotonPausa, self.BotonDetener, self.BotonPistaArriba, self.BotonPistaAbajo, self.BotonAbrirPistaS):
            LightButton(button, "gray50", "gray40")
        #--------Lista a la derecha--------:
        self.Dibujos = Canvas(self.ventana, bg="gray50", highlightbackground="gray70")
        self.Dibujos.place(x=300,y=0, width=300, height=375)
        for y in range(0, 375, 5):#dibuja lineas hasta el final de la ventana
            self.Dibujos.create_line(0,y, 300,y, fill="gray", tags="ListLines")
        self.List1 = DATA_LISTS[0]
        self.List2 = DATA_LISTS[1]
        self.List3 = DATA_LISTS[2]
        self.List4 = DATA_LISTS[3]
        self.List5 = DATA_LISTS[4]
        self.List6 = DATA_LISTS[5]
        self.List7 = DATA_LISTS[6]
        self.List8 = DATA_LISTS[7]
        self.List9 = DATA_LISTS[8]
        self.ListSelectActual = DATA_SELECTS[0]
        self.List1_Button = Button(self.ventana, text="L1", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL1)
        self.List1_Button.place(x=315, y=10, width=30, height=20)
        self.List2_Button = Button(self.ventana, text="L2", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL2)
        self.List2_Button.place(x=345, y=10, width=30, height=20)
        self.List3_Button = Button(self.ventana, text="L3", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL3)
        self.List3_Button.place(x=375, y=10, width=30, height=20)
        self.List4_Button = Button(self.ventana, text="L4", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL4)
        self.List4_Button.place(x=405, y=10, width=30, height=20)
        self.List5_Button = Button(self.ventana, text="L5", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL5)
        self.List5_Button.place(x=435, y=10, width=30, height=20)
        self.List6_Button = Button(self.ventana, text="L6", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL6)
        self.List6_Button.place(x=465, y=10, width=30, height=20)
        self.List7_Button = Button(self.ventana, text="L7", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL7)
        self.List7_Button.place(x=495, y=10, width=30, height=20)
        self.List8_Button = Button(self.ventana, text="L8", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL8)
        self.List8_Button.place(x=525, y=10, width=30, height=20)
        self.List9_Button = Button(self.ventana, text="L9", bg="gray80", relief="solid", activebackground="gray15", font="system", command=self.ChangeL9)
        self.List9_Button.place(x=555, y=10, width=30, height=20)
        self.ListTracks = Listbox(self.ventana, bg="gray10", fg="red", highlightbackground="red", font=fontSpecial, selectforeground="blue")
        self.ListTracks.place(x=310, y=40, width=280, height=230)
        self.scrollListY = Scrollbar(self.ListTracks, command=self.ListTracks.yview)
        self.scrollListY.pack(side="right", fill="y")
        self.ListTracks.configure(yscrollcommand=self.scrollListY.set)
        self.BaseButtons = Canvas(self.ventana, bg="gray70", relief="ridge", highlightbackground="red")
        self.BaseButtons.place(x=310, y=281, width=280, height=90)
        self.ButtonOpenTracks = Button(self.ventana, text="+Abrir archivos", bg="gray50", fg="blue", activebackground="gray35", font=fontSpecial, overrelief="ridge", command=self.OpenSoundsFromDisk)
        self.ButtonOpenTracks.place(x=314, y=285, width=89, height=20)
        self.ButtonOpenTrack = Button(self.ventana, text="+Abrir archivo", bg="gray50", fg="blue", activebackground="gray35", font=fontSpecial, overrelief="ridge", command=self.OpenSoundFromDisk)
        self.ButtonOpenTrack.place(x=405, y=285, width=89, height=20)
        self.ButtonOpenPath = Button(self.ventana, text="+Abrir carpeta", bg="gray50", fg="blue", activebackground="gray35", font=fontSpecial, overrelief="ridge", command=self.OpenDirectory)
        self.ButtonOpenPath.place(x=496, y=285, width=89, height=20)
        self.ButtonDelSelectTrack = Button(self.ventana, text="- Eliminar", bg="gray50", fg="red", activebackground="gray35", font=fontSpecial, overrelief="ridge", command=self.RemoveSoundSelect)
        self.ButtonDelSelectTrack.place(x=314, y=307, width=89, height=20)
        self.ButtonDelRepetingsTracks = Button(self.ventana, text="- Repetido", bg="gray50", fg="red", activebackground="gray35", font=fontSpecial, overrelief="ridge", command=self.RemoveSoundDouble)
        self.ButtonDelRepetingsTracks.place(x=405, y=307, width=89, height=20)
        self.ButtonDelAllTracks = Button(self.ventana, text="- Todos", bg="gray50", fg="red", activebackground="gray35", font=fontSpecial, overrelief="ridge", command=self.RemoveAllSounds)
        self.ButtonDelAllTracks.place(x=496, y=307, width=89, height=20)
        self.ResultSizeList = Label(self.ventana, bg="gray40", fg="gold", relief="sunken", font=fontSpecial, text="Pistas: 0, MB: 0.00, Duracion: 00:00")
        self.ResultSizeList.place(x=313, y=350, width=275)
        for ButtonOpt in (self.ButtonOpenTracks, self.ButtonOpenTrack, self.ButtonOpenPath, self.ButtonDelSelectTrack, self.ButtonDelRepetingsTracks, self.ButtonDelAllTracks):
            LightButton(ButtonOpt, "gray60", "gray50")
        self.ListTracks.bind("<Double-Button-1>", self.ActivateTrackInList)
        self.ventana.bind("<KeyPress-Return>", self.ActivateTrackInList)
        for buttonL in range(1,10):
            LightButton(eval("self.List"+str(buttonL)+"_Button"), "gray90", "gray80")
        self.SelectActualTrack = [DATA_SELECTS[1], self.ListSelectActual]
        self.Change(self.ListSelectActual)
        #Elegir varius elementos de la lista pero con el boton "shift" apretado:
        def Press(*e):
            self.ListTracks["selectmode"] = "extended"
        def DePress(*e):
            self.ListTracks["selectmode"] = "single"
        self.ventana.bind("<KeyPress-Shift_L>", Press)
        self.ventana.bind("<KeyRelease-Shift_L>", DePress)
        self.ventana.bind("<KeyPress-Shift_R>", Press)
        self.ventana.bind("<KeyRelease-Shift_R>", DePress)
        self.ventana.bind("<Destroy>", self.SaveAndExit)
        #remover track en lista con la tecla suprimir:
        self.ventana.bind("<KeyPress-Delete>", self.RemoveSoundSelect)
        ## System of Track UUuuuuuuuuuuuuuuu..
        self.IntVolume = self.ScalaVolumen.get()
        self.IntTone = self.ScalaTone.get()
        self.IntBalance = self.ScalaBalance.get()
        self.IntPosition = DATA_POSITION_TRACK
        self.RelojContador = clock()
        self.ventana.after(100, self.MovePosition)
        self.ventana.after(100, self.ViewStateTrack)
        self.ventana.bind("<Configure>", self.CaptureGeometryWin)
        self.ventana.bind("<Up>", self.UpVolume)
        self.ventana.bind("<Down>", self.DownVolume)
        self.ventana.bind("<Right>", self.RightPosition)
        self.ventana.bind("<Left>", self.LeftPosition)
        #Revisar si el icono del programa se encuentra:
        def CheckError():
            if ICON_ERROR:
                if exists(icon):
                    TextErrorIcon = '"'+getcwd()+'\\'+icon+'" es corrupto.'
                else:
                    TextErrorIcon = '"'+getcwd()+'\\'+icon+'" no existe.'
                showerror("CUH-F1Sound - error", TextErrorIcon)
        self.ventana.after(2000, CheckError)
        #Abrir ventana de informacion sobre el autor: Sokoleonardo
        self.AboutON = True
        self.ventana.bind("<F1>", self.AboutInfo)
        self.LoadTrackPlaying(1)

    def LoadTrackPlaying(self, play=True):
        if self.ListTracks.size():
            FileSelect = eval("self.List"+self.ListSelectActual)[int(self.SelectActualTrack[0])]
            try:
                self.Track = OpenerAudio.open_file(FileSelect, True)
                self.CheckValsAudio(False)
                self.ScalaPosicion["to"] = EyeD3Data(FileSelect)[0]
                self.ScalaPosicion.set(DATA_POSITION_TRACK)
                self.ActualizationTaggerReport()
                if play: self.PlayMP3()
                self.SetPosition()
            except:
                LauncherError(FileSelect)
            self.ventana.mainloop()

    def ViewStateTrack(self):#esta funcion revisa las opciones de track
        self.ventana.after(1000, self.ViewStateTrack)
        if self.Track:
            if self.Track.position == 0 and not self.Track.playing:
                if self.IntRepetir.get():
                    self.StopMP3("NotTitle")
                    self.PlayMP3()
                elif self.IntChangeAutoDown.get():
                    self.ChangeTrackDown()
                elif self.IntChangeRandom.get():
                    self.ChangeTrackRandom()

    def CheckRepeat(self):
        if self.IntRepetir.get():
            (self.IntChangeAutoDown.set(0), self.IntChangeRandom.set(0))
    def CheckChangeDown(self):
        if self.IntChangeAutoDown.get():
            (self.IntRepetir.set(0), self.IntChangeRandom.set(0))
    def CheckChangeRandom(self):
        if self.IntChangeRandom.get():
            (self.IntRepetir.set(0), self.IntChangeAutoDown.set(0))

    def PlayMP3(self, *e):
        if self.Track:
            self.CheckValsAudio(False)
            if self.Track.playing:
                self.ScalaPosicion.set(0)
                self.Track.reset()
            else:
                self.Track.play()
        else:
            if self.ListTracks.size():
                self.RenameSound(1)

    def PauseMP3(self, *e):
        if self.Track:
            if self.Track.playing:
                self.Track.pause()
            else:
                self.PlayMP3()

    def StopMP3(self, *e):
        if self.Track:
            self.Track.stop()
            self.Track = None
            self.ScalaPosicion["to"] = 0
            if not e:
                self.ventana.title("CUH-F1Sound :: Teclea F1 para informacion")
            elif e:
                if e[0] != "NotTitle":
                    self.ventana.title("CUH-F1Sound :: Teclea F1 para informacion")

    def ChangeTrackUp(self, *e):
        if self.ListTracks.size():
            ActualSelect = int(self.SelectActualTrack[0])
            if self.SelectActualTrack[1] != self.ListSelectActual: ActualSelect = 0
            select = ActualSelect-1 if ActualSelect > 0 else self.ListTracks.size()-1
            self.ListTracks.itemconfig(ActualSelect, fg="red")
            self.ListTracks.itemconfig(select, fg="#009600")
            self.SelectActualTrack[0] = select
            self.SelectActualTrack[1] = self.ListSelectActual
            self.RenameSound(1)

    def ChangeTrackDown(self, *e):
        if self.ListTracks.size():
            ActualSelect = int(self.SelectActualTrack[0])
            if self.SelectActualTrack[1] != self.ListSelectActual: ActualSelect = 0
            if ActualSelect == self.ListTracks.size()-1: ActualSelect = 0
            select = ActualSelect+1 if self.ListTracks.size()-1 else 0
            self.ListTracks.itemconfig(ActualSelect, fg="red")
            self.ListTracks.itemconfig(select, fg="#009600")
            self.SelectActualTrack[0] = select
            self.SelectActualTrack[1] = self.ListSelectActual
            self.RenameSound(1)

    def ChangeTrackRandom(self, *e):
        if self.ListTracks.size():
            ActualSelect = int(self.SelectActualTrack[0])
            if self.SelectActualTrack[1] != self.ListSelectActual: ActualSelect = 0
            else:
                self.ListTracks.itemconfig(ActualSelect, fg="red")
            select = randrange(0, self.ListTracks.size())
            while select == ActualSelect:
                select = randrange(0, self.ListTracks.size())
                if self.ListTracks.size() < 2:
                    break
            self.ListTracks.itemconfig(select, fg="#009600")
        self.SelectActualTrack[0] = select
        self.SelectActualTrack[1] = self.ListSelectActual
        self.RenameSound(1)

    def RenameSound(self, play=True):
        if self.ListTracks.size():
            FileSelect = eval("self.List"+self.ListSelectActual)[int(self.SelectActualTrack[0])]
            try:
                self.Track = OpenerAudio.open_file(FileSelect, True)
                self.CheckValsAudio(False)
                self.ScalaPosicion["to"] = EyeD3Data(FileSelect)[0]
                self.ScalaPosicion.set(0)
                self.ControlPosicion()
                self.ActualizationTaggerReport()
                if play: self.PlayMP3()
            except:
                LauncherError(FileSelect)
            self.ventana.mainloop()

    def CheckValsAudio(self, position):
        if self.Track:
            self.IntVolume = self.ScalaVolumen.get()
            self.IntTone = self.ScalaTone.get()
            self.IntBalance = self.ScalaBalance.get()
            self.IntPosition = self.ScalaPosicion.get()
            self.Track.volume = self.IntVolume / 100.0
            self.Track.pitchshift = self.IntTone / 100.0
            self.Track.pan = self.IntBalance / 100.0
            if position:
                self.Track.position = self.IntPosition

    def SetVolume(self, *e):
        if self.Track:
            self.IntVolume = self.ScalaVolumen.get()
            self.Track.volume = self.IntVolume / 100.0
    def SetTone(self, *e):
        if self.Track:
            self.IntTone = self.ScalaTone.get()
            self.Track.pitchshift = self.IntTone / 100.0
    def SetBalance(self, *e):
        if self.Track:
            self.IntBalance = self.ScalaBalance.get()
            self.Track.pan = self.IntBalance / 100.0
    def SetPosition(self):
        if self.Track:
            pos = self.Track.length / self.ScalaPosicion["to"]
            self.Track.position = self.ScalaPosicion.get() * pos

    def UpVolume(self, *e):
        self.ScalaVolumen.set(self.ScalaVolumen.get()+2)
    def DownVolume(self, *e):
        self.ScalaVolumen.set(self.ScalaVolumen.get()-2)
    def RightPosition(self, *e):
        self.ScalaPosicion.set(self.ScalaPosicion.get()+2)
    def LeftPosition(self, *e):
        self.ScalaPosicion.set(self.ScalaPosicion.get()-2)

    def OpenSoundsFromDisk(self):
        RouteMP3 = askopenfilenames(title="Abrir mas de un archivo", initialdir=splitdrive(argv[0])[0]+"\\", filetypes = (("Sounds","*.mp3"),))
        if RouteMP3:
            for track in RouteMP3:
                eval("self.List"+self.ListSelectActual).append(track)
            self.Change(self.ListSelectActual)

    def OpenSoundFromDisk(self):
        RouteMP3 = askopenfilename(title="Abrir un solo archivo", initialdir = splitdrive(argv[0])[0]+"\\", filetypes = (("Sound","*.mp3"),))
        if RouteMP3:
            eval("self.List"+self.ListSelectActual).append(RouteMP3)
            self.Change(self.ListSelectActual)

    def OpenDirectory(self):
        RoutePath = askdirectory(title = "Carpeta junto con sus subcarpetas", initialdir = splitdrive(argv[0])[0]+"\\")
        if RoutePath:
            def Searcher(path):
                path = [path]
                for nwpath in path:
                    for file in glob(nwpath+"*.mp3"):
                        yield file
                    for otherpath in glob(nwpath+"*\\"):
                        path.append(otherpath)
            for Mp3 in Searcher(RoutePath):
                eval("self.List"+self.ListSelectActual).append(Mp3)
            self.Change(self.ListSelectActual)

    def MovePosition(self, *e):
        self.ventana.after(10, self.MovePosition)
        if self.Track:
            if self.Track.playing:
                if clock() - 1 > self.RelojContador:
                    self.RelojContador = clock()
                    def Volver():
                        self.BoolMovePosition = True
                    self.BoolMovePosition = False
                    self.ScalaPosicion.set(self.ScalaPosicion.get()+1)
                    self.ventana.after(4,  Volver)

    def ControlVolumen(self, *e):
        self.ScalaVolumen["label"] = "Volumen: "+str(self.ScalaVolumen.get())+"%"
        self.SetVolume()

    def ControlTone(self, *e):
        self.ScalaTone["label"] = "Tono: "+str(self.ScalaTone.get())+"%"
        self.SetTone()

    def ControlBalance(self, *e):
        Salida = self.ScalaBalance.get()
        if Salida == 0:
            Frase = "Cent"
        elif Salida == -100:
            Frase = "Izq"
        elif Salida == 100:
            Frase = "Der"
        else:
            Frase = self.ScalaBalance.get()
        self.ScalaBalance["label"] = "Balance: "+str(Frase)
        self.SetBalance()

    def ControlPosicion(self, *e):
        self.ScalaPosicion["label"] = "Tiempo: "+GetTimeNormalTrack(self.ScalaPosicion.get()) +" / "+ GetTimeNormalTrack(self.ScalaPosicion["to"])
        self.IntPosition = self.ScalaPosicion.get()
        if self.BoolMovePosition:
            self.SetPosition()

    def CaptureGeometryWin(self, *e):
        self.GeometryWin = self.ventana.geometry()

    def AboutInfo(self, *e):
        if self.AboutON:
            self.AboutON = False
            def ExitAbout(*e):
                self.AboutON = True
                ventana.destroy()
            ventana = Tk()
            icon = "iconHeavy"+(".ico" if OperatingSystem() == "Windows" else ".png")
            try: ventana.iconbitmap(icon)
            except: pass
            ventana.title("CUH-F1Sound :: Informacion...")
            ventana.geometry("300x270+%d+%d" % (self.ventana.winfo_x()+150, self.ventana.winfo_y()+80))
            ventana.resizable(False, False)
            Frame(ventana, bg="gray").place(x=0, y=0, width=300, height=270)
            Label(ventana, bg="gray", fg="red", text="v1.0.0", font="system").place(x=250, y=0)
            Label(ventana, bg="gray", fg="blue", text=".::CUH-F1Sound::.", font=("small fonts", 19)).place(x=50, y=10, width=200)
            Label(ventana, bg="gray", fg="black", text="Creador de CUH-F1Sound v1.0.0:\nLeonardo A. Reichert\nen los foros/sitios es Sokoleonardo.", font="system").place(x=25, y=60, width=250)
            Texto = Text(ventana, bg="gray", fg="black")
            Texto.place(x=20, y=120, width=260, height=100)
            Texto.insert("0.0", "Novedades:\n")
            Texto.insert("end", "Se espera que en la siguiente version se pueda cam-biar el color (skins).\nLenguaje de programacion usado: Python 2.5.0.\nMuchas gracias por usar CUH-F1Sound.\n\nSaludos!")
            Texto["state"] = "disable"
            Button(ventana, bg="gray55", activeforeground="black", activebackground="gray40", fg="black", font="system", text="Ok", command=ExitAbout).place(x=135, y=230, width=30, height=30)
            ventana.bind("<Destroy>", ExitAbout)

    def SaveAndExit(self, *e):
        if self.Track:
            if self.Track.playing:
                self.Track.stop()
                self.Track = None
        FILE = open("SAVE.CUH-F1Sound", "w")
        dump([[self.IntVolume, self.IntTone, self.IntBalance],
                [self.IntRepetir.get(), self.IntChangeAutoDown.get(), self.IntChangeRandom.get()],
                [self.List1,self.List2,self.List3,self.List4,self.List5,self.List6,self.List7,self.List8,self.List9],
                [self.SelectActualTrack[1], self.SelectActualTrack[0]], self.GeometryWin, self.IntPosition], FILE)
        FILE.close()

Machine = Body_Master()
Machine.ventana.mainloop()

You are not allowed to view links. Register or Login

Saludos!
« Última modificación: Febrero 06, 2012, 08:41:02 am por Sokoleonardo »

Desconectado JaAViEr

  • ¡ Programming the world !
  • Colaborador
  • ****
  • Mensajes: 8218
  • https://uniendo.la
    • Ver Perfil
    • Ethereum Chile
Lindo código !
CREO que es la cosa más elaborada que he visto en tKinter...
Te recomiendo usar QT4 , verás que guapo queda el GUI

Saludos !
¡MI TWITTER You are not allowed to view links. Register or Login!
You are not allowed to view links. Register or Login !

Desconectado Sokoleonardo

  • Me das tu IP?
  • *
  • Mensajes: 36
  • Yo AMO a pOrtal HAcker!
    • Ver Perfil
Muy bien Javier me alegro de que te guste, si estas interesado en probarlo te comento que lo subi a sourceforge: You are not allowed to view links. Register or Login
Probalo y comenta te aseguro de que no te podes alrepentir de haberte bajado algo tan estable.

Saludos!


xx
[Python-Tkinter] Editor de etiquetas para *.MP3's by Sokoleonardo

Iniciado por Sokoleonardo

0 Respuestas
1397 Vistas
Último mensaje Enero 31, 2012, 01:31:01 pm
por Sokoleonardo
xx
PowerM (Reproductor de musica)by Sokoleonardo(descargar)4.2MB usalo sin Python

Iniciado por Sokoleonardo

0 Respuestas
1829 Vistas
Último mensaje Enero 05, 2012, 06:56:07 am
por Sokoleonardo
xx
[Python] Cliente Ftp Tkinter

Iniciado por runex

5 Respuestas
1810 Vistas
Último mensaje Abril 16, 2012, 07:31:52 pm
por JaAViEr
xx
MSN Fake in python by sokoleonardo

Iniciado por Sokoleonardo

4 Respuestas
1197 Vistas
Último mensaje Agosto 06, 2011, 02:55:29 pm
por mr.blood
xx
Crear menus profecionales en Tkinter. by Sokoleonardo

Iniciado por Sokoleonardo

0 Respuestas
3254 Vistas
Último mensaje Febrero 22, 2012, 06:42:07 pm
por Sokoleonardo
xx
Crear menus profecionales en Tkinter. by Sokoleonardo

Iniciado por Sokoleonardo

0 Respuestas
1201 Vistas
Último mensaje Febrero 22, 2012, 12:15:39 pm
por Sokoleonardo
question
reproductor multimedia en python

Iniciado por axelexequielluna

2 Respuestas
4575 Vistas
Último mensaje Noviembre 17, 2015, 11:49:26 pm
por mou
xx
[TK] Reproductor de .mp3 by sokoleonardo

Iniciado por Sokoleonardo

4 Respuestas
1422 Vistas
Último mensaje ſeptiembre 21, 2011, 09:12:35 am
por Sokoleonardo
xx
[TK] Reproductor de .mp3 by sokoleonardo v-0.2

Iniciado por Sokoleonardo

0 Respuestas
1015 Vistas
Último mensaje ſeptiembre 21, 2011, 09:11:45 am
por Sokoleonardo
exclamation
Gray Hat Python - Python Programming For Hackers And Reverse Engineers

Iniciado por Hacker290

4 Respuestas
3004 Vistas
Último mensaje Diciembre 19, 2012, 09:56:02 am
por JaAViEr