Programa que simula una renta de peliculas

Em este programa haremos uso de una Lista despegable (y tambien un separador) usando elementos que se encuentran en la libreria Tkinter de Python

from tkinter import Label,Entry,Button,Tk,Frame,W,N,S,E,END,HORIZONTAL,Spinbox
from tkinter.ttk import Combobox,Separator
from tkinter.messagebox import askyesno,showinfo,showerror;
#en el import, solo estoy pidiendo importar los elementos que vamos a usar, para no usar el * sin necesidad de traer mas elementos
def AddEntryMovie():
    Movie = CatchMovie.get()
    if (CatchMovie.get()==""):
        CatchMovie.config(bg="red")
        showerror("What Movie it is?", "Por favor ingresa una pelicula! no dejes el campo en blanco!")
        CatchMovie.config(bg="white")
    #Una pequeña "excepcion" por si el campo de texto para ingresar la pelicula esta vacio     
    else:
        if (Classes.get()==""):
            #otra pequeña "excepcion" por si la clasificación de la pelicula no tiene seleccionada una clasificación             
            showerror("What Movie it is?","Por favor selecciona una clasificación!")
        else:
            if (askyesno("Are you sure?", "Deseas añadir esta pelicula: \n\""+Movie+"\"\nA la lista de peliculas?")==True):
                values = list(MoviesOnList["values"])
                #se crea dentro de la funcion la Variable "values" que sera una lista de los valores que se encuentran en la lista despegable                 
                MoviesOnList["values"] = values + [Movie]
                #de la lista despegalble agregamos el nuevo valor que esta en nuestro campo de texto, para esto debemos ponerlo entre 
                #  [] para que se interprete como el valor de una lista y pueda sumarse a la lista despegable de peliculas 
                Classifications.insert(i,Classes.get())
                #añade la clasificiación a una lista, para asi tenerla disponible en la Lista Despegable de Peliculas disponibles                 
                Mov.insert(i,Movie)
                i+1                CatchMovie.delete(0, END)
                #ya lo hemos visto antes pero lo explicare aun asi, .delete(0, END) borra el texto dentro del Entry 
                CatchMovie.insert(0, "")
                #Aqui es casi lo mismo, pero deja el campo Vacio y usable, tambien para evitar errores de captura 
                Classes.set("")
                #Reinicia la Lista Despegable de las clasificaciones 
                showinfo("Exito!","Has añadido: \""+Movie+"\" A la lista de Peliculas")
            else:
                showinfo("Guess No","La Pelicula: "+Movie+" No sera añadida")
def firstDone():
    if (askyesno("Are you sure?","ADVERTENCIA: ESTA ACCION NO PUEDE SER DESHECHA" "\nSi de verdad ya terminaste te agregar peliculas, prosigue, si no, DETENTE!")==True):
        CatchMovie.config(state="disable")
        Classes.config(state="disable")
        AddMov.config(state="disable")
        Done.config(state="disable")
        #tambien se habia visto antes, pero explicare aun asi, el 'state' "disable" deshabilita el componente del frame 
        app.geometry("600x300")
        #se puede cambiar la dimension de una ventana, aunque se haya establecido un tamaño, esto nos permite controlar la ventana y los componentes a mostrar 
        MovietoRent.grid()
        MoviesOnList.grid()
        ClassifiedAs.grid()
        AskRent.grid()
        Days4Rent.grid()
        Rent.grid()
        #simplemente con .grid() vuelvo a colocar en su respectivo lugar, los elementos que no son visibles para el usuario, ocultos con '.grid_remove()'     
    else:
        showinfo("","Puedes seguir agregando peliculas si gustas!")
def MovieSel(self):
    ClassifiedAs.config(state="normal")
    #para que un Entry pueda mostrar un texto, es necesario que este en un estado normal (state="normal") 
    ClassifiedAs.delete(0, END)
    ClassifiedAs.insert(0, Classifications.__getitem__(Mov.index(MoviesOnList.get())))
    #aqui se hace uso de la Lista [] y el atributo "__getitem__()" para obtener lo que este en la lista, para ello 
    #es necesario poner un indice numerico, asi que utilizando ".index()" puedo llamar solo el indice (numero en la lista) 
    #y .__getitem__() obtendra el objeto que este en ese indice de la lista, para asi poder mostrar la clasificación correecta     
    ClassifiedAs.config(state="readonly")
    #al cambiar el estado a "Solo Lectura" (state="readonly") el Entry solo mostrara Texto, pero no permitira la entrada de datos o textos 
def RentAMovie():
    if (askyesno("You ready?","Deseas Rentar la pelicula: "+MoviesOnList.get()+
                              "\n por "+Days4Rent.get()+" Dia/s?")==True):
        if (ClassifiedAs.get()=="Adultos"):
            if(askyesno("Age Issue","Eres Mayor de Edad?")==True):
                showinfo("Ask for: ","Presente su Identificación")
            else:
                showerror("Get outta here","NO SE RENTAN PELICULAS A MENORES")
        else:
            showinfo("Have a nice day!","Disfruta de tu pelicula! \nQue tengas un Buen dia :)")
    else:
        showinfo("Ok?","De acuerdo, revisa tus opciones entonces :)")
app = Tk()
app.geometry("600x120")
app.title("Lista de Peliculas")
vp = Frame(app)
vp.grid(column=0,row=0,padx=(30,30), pady=(20,20))
vp.rowconfigure(0, weight=1)
vp.columnconfigure(0, weight=1)
Classified = Label(vp, text="Clasificación")
Classified.grid(column=2, row=1, padx=(10,10), pady=(10,10))
AskMov = Label(vp, text="Ingrese una Pelicula: ")
AskMov.grid(column=1, row=1, padx=(10,10), pady=(10,10), sticky=W)
cMovie = ""CatchMovie = Entry(vp, textvariable=cMovie, width=35)
CatchMovie.grid(column=1, row=2, padx=(10,10), pady=(10,10))
AddMov = Button(vp, text="Añadir", command=AddEntryMovie)
AddMov.grid(column=3, row=2, padx=(10,10), pady=(10,10))
Done = Button(vp, text="Finalizar", command=firstDone)
Done.grid(column=4, row=2, padx=(10,10), pady=(10,10))
Classes = Combobox (vp, state="readonly")
Classes.grid(column=2, row=2, padx=(10,10), pady=(10,10))
Classes["values"]=["Para todas las Edades","Familiar","Mayores de 10","Adolescentes","Mayores de 15","Adultos"]
Separator(vp, orient=HORIZONTAL).grid(column=1,row=3,columnspan=4,sticky=W+E,pady=(10,10))
MovietoRent = Label(vp, text="Pelicula a Rentar: ")
MovietoRent.grid(column=1, row=4, padx=(10,10), pady=(30,10), stick=W)
MovietoRent.grid_remove()
MoviesOnList = Combobox (vp, state="readonly")
MoviesOnList.grid(column=1,row=5,padx=(10,10),pady=(10,10), sticky=W+E)
MoviesOnList.bind("<<ComboboxSelected>>",MovieSel)
MoviesOnList.grid_remove()
ClassifiedAs = Entry (vp,state="readonly")
ClassifiedAs.grid(column=2, row=5, padx=(10,10), pady=(10,10), sticky=W+E)
ClassifiedAs.grid_remove()
AskRent = Label(vp, text="Dias\n a Rentar")
AskRent.grid(column=3, row=4, padx=(10,10), pady=(10,10))
AskRent.grid_remove()
Days4Rent = Spinbox(vp,width=5, from_=1, to=7)
Days4Rent.grid(column=3, row=5, padx=(10,10), pady=(10,10), sticky=N+S)
Days4Rent.grid_remove()
Rent = Button(vp, text="Rentar", command=RentAMovie)
Rent.grid(column=4, row=5, padx=(10,10), pady=(10,10))
Rent.grid_remove()
Classifications = []
Mov = []
i = int(0)
app.mainloop()

Comentarios

Entradas más populares de este blog

Programa en Python que solicite Nombre de Usuario y Contraseña

Programa que convierta de una Unidad de Temperatura a varias

Elaboración de un Programa en Python (3.X) que solicite el nombre y lo despliegue en MessageBox