diff --git a/Alarma/alarma.py b/Alarma/alarma.py index 44c2e87..e15a032 100644 --- a/Alarma/alarma.py +++ b/Alarma/alarma.py @@ -1,3 +1,5 @@ + + # Alarma # @autor: Magno Efren # Youtube: https://www.youtube.com/c/MagnoEfren @@ -5,28 +7,23 @@ from tkinter import messagebox , Label,Tk,ttk from time import strftime from pygame import mixer - ventana = Tk() ventana.config(bg='black') ventana.geometry('500x250') ventana.title('Alarma') ventana.minsize(width=500, height=250) mixer.init() - lista_horas = [] lista_minutos = [] lista_segundos = [] for i in range(0,24): lista_horas.append(i) - for i in range(0,60): lista_minutos.append(i) - for i in range(0,60): lista_segundos.append(i) - texto1 = Label(ventana, text= 'Hora', bg= 'black', fg= 'magenta', font= ('Arial',12, 'bold')) texto1.grid(row=1, column=0, padx =5, pady=5) texto2 = Label(ventana, text= 'Minutos', bg= 'black', fg= 'magenta', font= ('Arial',12, 'bold')) @@ -34,7 +31,6 @@ texto3 = Label(ventana, text= 'Segundos', bg= 'black', fg= 'magenta', font= ('Arial',12, 'bold')) texto3.grid(row=1, column=2, padx =5, pady=5) - combobox1 = ttk.Combobox(ventana, values = lista_horas , style = "TCombobox", justify='center',width='12', font='Arial') combobox1.grid(row=2, column=0, padx =15, pady=5) combobox1.current(0) @@ -44,8 +40,6 @@ combobox3 = ttk.Combobox(ventana, values = lista_segundos , style = "TCombobox", justify='center',width='12', font='Arial') combobox3.grid(row=2, column=2, padx =15, pady=5) combobox3.current(0) - - style = ttk.Style() style.theme_create('combostyle', parent='alt',settings = {'TCombobox': {'configure': @@ -60,7 +54,6 @@ ventana.option_add('*TCombobox*Listbox*selectBackground', 'green2') ventana.option_add('*TCombobox*Listbox*selectForeground', 'black') - alarma = Label(ventana, fg = 'violet', bg='black', font = ('Radioland', 20)) alarma.grid(column=0, row=3, sticky="nsew", ipadx=5, ipady=20) repetir = Label(ventana, fg = 'white', bg='black', text = 'Repetir', font='Arial') @@ -69,24 +62,17 @@ cantidad.grid(row=3, column=2, padx =5, pady=5) cantidad.current(0) - - def obtener_tiempo(): x_hora = combobox1.get() x_minutos = combobox2.get() x_segundos = combobox3.get() - hora = strftime('%H') minutos = strftime('%M') segundos = strftime('%S') - hora_total = (hora + ' : '+ minutos+ ' : '+ segundos) texto_hora.config(text=hora_total, font = ('Radioland', 25)) - - hora_alarma = x_hora +' : '+ x_minutos +' : '+ x_segundos alarma['text']= hora_alarma - #condicion: if int(hora) == int(x_hora): if int(minutos) == int(x_minutos): @@ -94,13 +80,9 @@ def obtener_tiempo(): mixer.music.load("audio.mp3") mixer.music.play(loops= int(cantidad.get())) messagebox.showinfo(message=hora_alarma, title="Alarma") - texto_hora.after(100, obtener_tiempo) - - texto_hora = Label(ventana, fg = 'green2', bg='black') texto_hora.grid(columnspan=3, row=0,sticky="nsew", ipadx=5, ipady=20) - obtener_tiempo() - ventana.mainloop() + diff --git "a/Aplicacion Meteorol\303\263gica/main.py" "b/Aplicacion Meteorol\303\263gica/main.py" index 5a0adca..bd836ae 100644 --- "a/Aplicacion Meteorol\303\263gica/main.py" +++ "b/Aplicacion Meteorol\303\263gica/main.py" @@ -10,25 +10,21 @@ class Ventana(Frame): def __init__(self, master, *args): super().__init__( master,*args) - self.click = True - + self.master.columnconfigure(0, weight=1) self.master.columnconfigure(1, weight=1) self.master.rowconfigure(1, weight=1) self.master.columnconfigure(2, weight=1) self.master.rowconfigure(2, weight=1) - self.frame = Frame(self.master, bg='white', highlightbackground='deep pink',highlightthickness=2) self.frame.grid(columnspan=3, row = 0, sticky='nsew', padx=5, pady=5) - self.frame2 = Frame(self.master, bg='pale green', highlightbackground='dark violet',highlightthickness=2) self.frame2.grid(column=0, row = 1, sticky='nsew', padx=5, pady=5) self.frame3 = Frame(self.master, bg='SeaGreen1', highlightbackground='dark violet',highlightthickness=2) #pink self.frame3.grid(column=1, row = 1, sticky='nsew', padx=5, pady=5) self.frame4 = Frame(self.master, bg='PaleTurquoise1', highlightbackground='dark violet',highlightthickness=2) self.frame4.grid(column=2, row = 1, sticky='nsew', padx=5, pady=5) - self.frame5 = Frame(self.master, bg='cyan2', highlightbackground='dark violet',highlightthickness=2) #light coral self.frame5.grid(column=0, row = 2, sticky='nsew', padx=5, pady=5) self.frame6 = Frame(self.master, bg='aquamarine', highlightbackground='dark violet',highlightthickness=2) @@ -47,10 +43,8 @@ def animacion(self): self.frame6.config(highlightbackground='red') self.frame7.config(highlightbackground='red') self.obtener_tiempo() - gif = Image.open('buscar.gif') frames = gif.n_frames - if self.click == True: for i in range(1, frames): self.inicio = PhotoImage(file ='buscar.gif', format='gif -index %i' %(i)) @@ -59,17 +53,14 @@ def animacion(self): self.master.update() self.click= False if i + 1 == frames: - self.click = True - - + self.click = True def obtener_tiempo(self): ciudad = self.ingresa_ciudad.get() - #key : 'f08c20ee319398d4ccb55d6a775da822' + #key : 'f08c20ee319398d4ccb55d6a775da82211' #API = 'api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}' #Actualizar la API key con la de su cuenta: - API = 'https://api.openweathermap.org/data/2.5/weather?q=' +ciudad+ '&appid=f08c20ee319398d4ccb55d6a775da822' - + API = 'https://api.openweathermap.org/data/2.5/weather?q=' +ciudad+ '&appid=f08c20ee319398d4ccb55d6a775da82211' try: json_datos = requests.get(API).json() self.temp['text'] = str(int(json_datos['main']['temp'] - 273.15)) + " °C" @@ -91,9 +82,7 @@ def obtener_tiempo(self): self.master.update() time.sleep(1) self.aviso['text'] = '' - self.localidad['text'] = '' - - + self.localidad['text'] = '' def widgets(self): self.inicio = PhotoImage(file ='buscar.gif') self.imagen_temp = PhotoImage(file ='temperatura.png') @@ -102,7 +91,6 @@ def widgets(self): self.imagen_humedad = PhotoImage(file ='humedad.png') self.imagen_viento = PhotoImage(file ='viento.png') self.imagen_presion = PhotoImage(file ='presion.png') - self.bt_inicio = Button(self.frame, image= self.inicio, bg='red',highlightthickness=0, activebackground='white', bd=0, command = self.animacion) self.bt_inicio.grid(column=0, row=0, padx=2, pady=2) self.ingresa_ciudad = Entry(self.frame, font=('Comic Sans MS', 12),highlightbackground = "DarkOrchid1", highlightcolor= "green2", highlightthickness=2) diff --git a/Base de datos MySQL/base_datos.sql b/Base de datos MySQL/base_datos.sql new file mode 100644 index 0000000..67c92a2 --- /dev/null +++ b/Base de datos MySQL/base_datos.sql @@ -0,0 +1,41 @@ + +-- Volcando estructura de base de datos para base_datos +CREATE DATABASE IF NOT EXISTS `base_datos` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; +USE `base_datos`; + +-- Volcando estructura para tabla base_datos.productos +CREATE TABLE IF NOT EXISTS `productos` ( + `ID` int NOT NULL AUTO_INCREMENT, + `CODIGO` char(10) NOT NULL DEFAULT '0', + `NOMBRE` char(20) NOT NULL DEFAULT '0', + `MODELO` char(20) NOT NULL DEFAULT '0', + `PRECIO` char(50) NOT NULL DEFAULT '0', + `CANTIDAD` char(50) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB AUTO_INCREMENT=188 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + +-- Volcando datos para la tabla base_datos.productos: ~19 rows (aproximadamente) +DELETE FROM `productos`; +/*!40000 ALTER TABLE `productos` DISABLE KEYS */; +INSERT INTO `productos` (`ID`, `CODIGO`, `NOMBRE`, `MODELO`, `PRECIO`, `CANTIDAD`) VALUES + (39, 'RES001', 'RESISTENCIA', 'RV', '2.00', '222'), + (40, 'TRAS-11', 'TRANSISTOR', 'PNP', '1.00', '554'), + (44, '10101', 'CONDENSADOR', 'CERAMICO', '2.00', '100'), + (168, 'DB121', 'DIODO', 'ZENER', '1.50', '231'), + (169, 'IC002', 'IC', 'AND', '1.00', '200'), + (170, 'IC003', 'IC', 'XOR', '1.00', '300'), + (171, 'D0092', 'DIOD0', 'ZENER', '2.00', '232'), + (172, 'RE21', 'RELE', '221R', '2.50', '423'), + (173, '2560', 'ARDUINO', 'MEGA', '30.0', '37'), + (174, '2021DS', 'ARDUINO', 'UNO R3', '15.50', '73'), + (175, 'RES2021', 'RESISTENCIA', '4B', '0.10', '1000'), + (176, 'LED122', 'LED', 'GREENR3', '0.50', '144'), + (177, 'LDR43', 'LDR', 'LDRG', '2.00', '43'), + (178, 'FUSI232', 'FUSIBLE', '23FDEW', '2.00', '331'), + (179, 'MATRIZ32', 'MATRIZ', '32X8', '50.0', '56'), + (180, 'SENSORRE', 'ULTRASONIC', 'RGR0544', '5.00', '231'), + (181, '555N', 'TIMER', '555', '1.50', '621'), + (182, 'ER43', 'PILAS', 'AAA', '2.00', '544'), + (185, '1212', '12121', '12121', '22121', '12121'); +/*!40000 ALTER TABLE `productos` ENABLE KEYS */; + diff --git a/Bloc de Notas/main.py b/Bloc de Notas/main.py index 73f734d..9a95a4f 100644 --- a/Bloc de Notas/main.py +++ b/Bloc de Notas/main.py @@ -16,7 +16,6 @@ def __init__(self, master): self.master.iconbitmap('icono.ico') self.master.geometry('700x500+380+20') self.master.protocol("WM_DELETE_WINDOW", self.salir) - self.señal_ajustes = BooleanVar() self.info_estado = BooleanVar() self.info_estado.set(False) @@ -26,16 +25,13 @@ def __init__(self, master): self.y = 0 self.n = 12 self.f = 'Arial' - - self.widgets() self.master.columnconfigure(0, weight=1) self.master.rowconfigure(0, weight=1) - + def widgets(self): menu = Menu(self.master) self.master.config(menu = menu) - archivo = Menu(menu, tearoff=0) archivo.add_command(label="Nuevo", command = self.nueva_ventana) archivo.add_command(label="Ventana Nueva", command = self.segunda_ventana) @@ -43,10 +39,10 @@ def widgets(self): archivo.add_command(label="Guardar", command = self.guardar_archivo) archivo.add_separator() archivo.add_command(label="Salir", command = self.master.quit) - edicion = Menu(menu, tearoff=0) edicion.add_command(label="Deshacer", command = lambda: self.texto.edit_undo()) - edicion.add_separator() + edicion.add_separator() + edicion.add_command(label="Cortar", accelerator='Ctrl+X', command = lambda: self.master.focus_get().event_generate("<>") ) edicion.add_command(label="Copiar", accelerator='Ctrl+C', @@ -55,34 +51,28 @@ def widgets(self): command = lambda: self.master.focus_get().event_generate("<>")) edicion.add_command(label="Eliminar", accelerator= 'Supr', command = lambda: self.master.focus_get().event_generate("<>")) - formato = Menu(menu, tearoff=0) formato.add_checkbutton(label="Ajustes de linea", variable = self.señal_ajustes, command= self.ajustes_de_linea) formato.add_command(label="Fuente", command= self.formato_fuente) formato.add_command(label="Color de texto", command= self.elegir_color_texto) formato.add_command(label="Color de fondo", command= self.elegir_color_fondo) - ver = Menu(menu, tearoff=0) submenu = Menu(menu, tearoff=0) submenu.add_command(label="Acercar", command= self.zoom_mas) submenu.add_command(label="Alejar", command= self.zoom_menos) submenu.add_command(label="Restaurar Zoom", command= lambda: self.texto.config(font= (self.f, 12))) - ver.add_cascade(label="Zoom", menu = submenu) ver.add_checkbutton(label="Barra de estado", variable = self.info_estado, command = self.barra_de_estado) - ayuda = Menu(menu, tearoff=0) ayuda.add_command(label="Ver la ayuda") ayuda.add_separator() ayuda.add_command(label="Acerca del Bloc de notas", command= self.acerca_de) - menu.add_cascade(label="Archivo", menu=archivo) menu.add_cascade(label="Edicion", menu=edicion) menu.add_cascade(label="Formato", menu=formato) menu.add_cascade(label="Ver", menu=ver) menu.add_cascade(label="Ayuda", menu=ayuda) - - self.texto = Text(self.master, font= ('Arial', 12), undo= True, insertbackground='red') #undo = True, selectbackground='yellow' + self.texto = Text(self.master, font= ('Arial', 12), undo= True, insertbackground='red') self.texto.grid(column=0, row=0, sticky='nsew') ladox = Scrollbar(self.master, orient = 'horizontal', command= self.texto.xview) ladox.grid(column=0, row = 1, sticky='ew') @@ -90,6 +80,8 @@ def widgets(self): ladoy.grid(column = 1, row = 0, sticky='ns') self.texto.configure(xscrollcommand = ladox.set, yscrollcommand = ladoy.set) self.barra_estado = Label(self.master, font = ('Segoe UI Symbol', 10)) + #eventos + self.master.bind('', self.salir) def ajustes_de_linea(self): if self.señal_ajustes.get() == True: @@ -124,7 +116,7 @@ def zoom_menos(self): else: self.n = 12 - def salir(self): + def salir(self, *args): valor = messagebox.askyesno('Salir', '¿Desea Salir?',parent= self.master) if valor == True: self.master.destroy() @@ -163,23 +155,22 @@ def nueva_ventana(self): self.texto.delete('1.0', 'end') def segunda_ventana(self): - segunda_ventana = Toplevel() + segunda_ventana = Toplevel(self.master) segunda_ventana = Ventana(segunda_ventana) - segunda_ventana.mainloop() def acerca_de(self): - vent_info = Toplevel(bg='white') + vent_info = Toplevel(self.master) + vent_info.config( bg='white') vent_info.title('') vent_info.resizable(0,0) vent_info.iconbitmap('icono.ico') vent_info.geometry('350x200+200+200') Label(vent_info, bg='white', text= 'Programa realizado en Python \n con la liberia de Tkinter \n\n Autor: Magno Efren').pack(expand=True) - vent_info.mainloop() def formato_fuente(self): - self.vent_tipo_fuente = Toplevel() + self.vent_tipo_fuente = Toplevel(self.master) self.vent_tipo_fuente.overrideredirect(1) self.vent_tipo_fuente.geometry('390x290+400+200') self.vent_tipo_fuente.config(bg= 'SeaGreen1', relief ='raised', bd = 3) @@ -214,7 +205,7 @@ def formato_fuente(self): self.aceptar.grid(columnspan=2, row=3, padx=5, pady=5) self.aplicar_formato() - self.vent_tipo_fuente.mainloop() + def mover(self, event): deltax = event.x - self.x @@ -249,7 +240,7 @@ def elegir_color_texto(self): self.texto.config(fg= color, insertbackground = color) def elegir_color_fondo(self): - color = colorchooser.askcolor()[1] #ff0000 askcolor()[1] , askcolor()[0] (255.0, 0.0, 0.0) + color = colorchooser.askcolor()[1] self.texto.config(bg= color) @@ -258,4 +249,3 @@ def elegir_color_fondo(self): app = Ventana(ventana) app.mainloop() - \ No newline at end of file diff --git a/Cronometro/cronometro.py b/Cronometro/cronometro.py index 4073bdf..a7daf78 100644 --- a/Cronometro/cronometro.py +++ b/Cronometro/cronometro.py @@ -1,17 +1,18 @@ + # Cronometro # @autor: Magno Efren # Youtube: https://www.youtube.com/c/MagnoEfren +# Revise la versión 2 donde hay mejoras para evitar repetir codigo: +# https://github.com/MagnoEfren/gui_python_tkinter/blob/main/Cronometro/cronometro_v2.py from tkinter import Canvas, Button, Frame, Label,Tk - ventana = Tk() ventana.config(bg='black') ventana.geometry('500x250') ventana.title('Cronometro') ventana.minsize(width=500, height=250) - ventana.columnconfigure(0,weight=2) ventana.rowconfigure(0,weight=2) ventana.columnconfigure(1, weight=2) @@ -23,7 +24,6 @@ ventana.columnconfigure(1,weight=2) ventana.rowconfigure(1,weight=1) - frame1 = Frame(ventana) frame1.grid(column=0,row=0,sticky='snew') frame2 = Frame(ventana) @@ -34,9 +34,7 @@ frame4.grid(row=1, columnspan=3, sticky='snew') frame5 = Frame(ventana, bg='black') frame5.grid(row=2, columnspan=3, sticky='snew') - #--- - frame1.columnconfigure(0, weight=1) frame1.rowconfigure(0, weight=1) frame2.columnconfigure(0, weight=1) @@ -47,16 +45,12 @@ frame4.rowconfigure(0, weight=1) frame5.columnconfigure(0, weight=1) frame5.rowconfigure(0, weight=1) - - canvas1= Canvas(frame1, bg='gray40', width=200, height =200,highlightthickness=0) canvas1.grid(column=0,row=0, sticky='nsew') canvas2= Canvas(frame2, bg='gray30', width=200, height =200,highlightthickness=0) canvas2.grid(column=0,row=0, sticky='nsew') canvas3= Canvas(frame3, bg='gray20', width=200, height =200,highlightthickness=0) canvas3.grid(column=0,row=0, sticky='nsew') - - texto1 = canvas1.create_text(1,1, text='0', font=('Arial',12,'bold'), fill= 'White') texto2 = canvas2.create_text(1,1, text='0', font=('Arial',12,'bold'), fill= 'White') texto3 = canvas3.create_text(1,1, text='0', font=('Arial',12,'bold'), fill= 'White') @@ -72,7 +66,6 @@ circulo2 = canvas2.create_oval(10,10,100,100, outline='medium spring green',width=10) circulo3 = canvas3.create_oval(10,10,100,100, outline='magenta2',width=10) - mi = 0 se = 0 ml = 0 @@ -81,7 +74,6 @@ clik_stop = 0 clik_inicio =0 - def iniciar_pausar(): global mi, se, ml, contar, clik_stop, clik_inicio ml = ml + 1 @@ -91,27 +83,20 @@ def iniciar_pausar(): if se ==59: se = 0 mi = mi + 1 - contar = inicio.after(1, iniciar_pausar) - - clik_inicio = inicio.grid_forget() - + clik_inicio = inicio.grid_forget() if clik_inicio is None: stop.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') stop.config(bg= 'orange', text= 'DETENER') - def stop_boton(): global contar, clik_stop - - clik_stop = stop.grid_forget() if clik_stop is None : inicio.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') inicio.config(bg= 'aqua', text='CONTINUAR') inicio.after_cancel(contar) - def vueltas(): global mi, se, ml,click_lectura @@ -136,9 +121,6 @@ def vueltas(): fg = 'white', bg='gray10') click_lectura = 0 - - - def reiniciar(): global mi, se, ml, contar, click_lectura mi = 0 @@ -152,14 +134,11 @@ def reiniciar(): lectura4.configure(text='Lectura 4', fg = 'white', bg='gray10') lectura5.configure(text='Lectura 5', fg = 'white', bg='gray10') lectura6.configure(text='Lectura 6', fg = 'white', bg='gray10') - stop.grid_forget() inicio.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') inicio.config(bg= 'green2', text='INICIAR') - - def coordenadas(): x = canvas1.winfo_width() y = canvas1.winfo_height() @@ -168,43 +147,32 @@ def coordenadas(): y1 = int(y - 0.1*x - 0.1*y + 20) x2 = int(x - 0.4*x - 0.4*y - 15) y2 = int(y - 0.4*x - 0.4*y - 30) - tamano = int( y1*0.2 + x1*0.1 + 10 ) tamano_texto = int( y1*0.02 + x1*0.02 + 3 ) - #print(x1, y1, x2, y2) canvas1.coords(circulo1, x1,y1,x2,y2) canvas2.coords(circulo2, x1,y1,x2,y2) canvas3.coords(circulo3, x1,y1,x2,y2) - #cordenas numeros z1 = int(x1*0.6- 10) z2 = int(y1*0.6 - 10) - #coordenadas texto w1 = int(x1*0.49 + 8) w2 = int(y1*0.8 + 10) - canvas1.coords(texto1, z1, z2) canvas2.coords(texto2, z1, z2) canvas3.coords(texto3, z1, z2) - canvas1.itemconfig(texto1, font=('Arial',tamano,'bold'),text= mi) canvas2.itemconfig(texto2, font=('Arial',tamano,'bold'),text= se ) canvas3.itemconfig(texto2, font=('Arial',tamano,'bold'), text= ml) - canvas1.coords(texto_minutos, w1, w2) canvas2.coords(texto_segundos, w1, w2) canvas3.coords(texto_milisegundos, w1, w2) - canvas1.itemconfig(texto_minutos, font=('Arial',tamano_texto,'bold')) canvas2.itemconfig(texto_segundos, font=('Arial',tamano_texto,'bold')) - canvas3.itemconfig(texto_milisegundos, font=('Arial',tamano_texto,'bold')) - + canvas3.itemconfig(texto_milisegundos, font=('Arial',tamano_texto,'bold')) canvas1.after(1000, coordenadas) - - frame4.columnconfigure(0, weight= 1) frame4.rowconfigure(0, weight= 1) frame4.columnconfigure(1, weight= 1) @@ -218,7 +186,6 @@ def coordenadas(): frame4.columnconfigure(5, weight= 1) frame4.rowconfigure(0, weight= 1) - lectura1 = Label(frame4, text='Lectura 1', fg = 'white', bg='gray10') lectura1.grid(column=0,row=0, sticky='nsew') lectura2 = Label(frame4, text='Lectura 2', fg = 'white', bg='gray10') @@ -239,7 +206,6 @@ def coordenadas(): frame5.columnconfigure(2, weight= 1) frame5.rowconfigure(0, weight= 1) - stop = Button(frame5, text = 'DETENER', relief = "raised",bd=5, bg='orange', font=('Arial', 12, 'bold'), width =20, command = stop_boton) stop.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') @@ -256,40 +222,6 @@ def coordenadas(): font=('Arial', 12, 'bold'), width =20, command = reiniciar) fin.grid(column=2, row=0, padx =10, pady=10, sticky='nsew') - coordenadas() - ventana.mainloop() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Cronometro/cronometro_v2.py b/Cronometro/cronometro_v2.py new file mode 100644 index 0000000..295e2a1 --- /dev/null +++ b/Cronometro/cronometro_v2.py @@ -0,0 +1,195 @@ +# Cronometro +# @autor: Magno Efren +# Youtube: https://www.youtube.com/c/MagnoEfren + +from tkinter import Canvas, Button, Frame, Label,Tk +ventana = Tk() +ventana.config(bg='black') +ventana.geometry('500x250') +ventana.title('Cronometro') +ventana.minsize(width=500, height=250) + +ventana.columnconfigure([0,1,2],weight=2) +ventana.rowconfigure(0, weight=2) +ventana.rowconfigure(1,weight=1) + +frame1 = Frame(ventana) +frame1.grid(column=0,row=0,sticky='snew') +frame2 = Frame(ventana) +frame2.grid(column=1,row=0,sticky='snew') +frame3 = Frame(ventana) +frame3.grid(column=2,row=0,sticky='snew') +frame4 = Frame(ventana, bg='gray10') +frame4.grid(row=1, columnspan=3, sticky='snew') +frame5 = Frame(ventana, bg='black') +frame5.grid(row=2, columnspan=3, sticky='snew') +#--- +frame1.columnconfigure(0, weight=1) +frame1.rowconfigure(0, weight=1) +frame2.columnconfigure(0, weight=1) +frame2.rowconfigure(0, weight=1) +frame3.columnconfigure(0, weight=1) +frame3.rowconfigure(0, weight=1) +frame4.columnconfigure(0, weight=1) +frame4.rowconfigure(0, weight=1) +frame5.columnconfigure(0, weight=1) +frame5.rowconfigure(0, weight=1) + +canvas1= Canvas(frame1, bg='gray40', width=200, height =200,highlightthickness=0) +canvas1.grid(column=0,row=0, sticky='nsew') +canvas2= Canvas(frame2, bg='gray30', width=200, height =200,highlightthickness=0) +canvas2.grid(column=0,row=0, sticky='nsew') +canvas3= Canvas(frame3, bg='gray20', width=200, height =200,highlightthickness=0) +canvas3.grid(column=0,row=0, sticky='nsew') + +texto1 = canvas1.create_text(1,1, text='0', font=('Arial',12,'bold'), fill= 'White') +texto2 = canvas2.create_text(1,1, text='0', font=('Arial',12,'bold'), fill= 'White') +texto3 = canvas3.create_text(1,1, text='0', font=('Arial',12,'bold'), fill= 'White') + +texto_minutos = canvas1.create_text(1,1, text='Minutos', + font=('Arial',12,'bold'), fill= 'White') +texto_segundos = canvas2.create_text(1,1, text='Segundos', + font=('Arial',12,'bold'), fill= 'White') +texto_milisegundos = canvas3.create_text(1,1, text='Milisegundos', + font=('Arial',10,'bold'), fill= 'White') + +circulo1 = canvas1.create_oval(10,10,100,100, outline='red2',width=10) +circulo2 = canvas2.create_oval(10,10,100,100, outline='medium spring green',width=10) +circulo3 = canvas3.create_oval(10,10,100,100, outline='magenta2',width=10) + +mi = 0 +se = 0 +ml = 0 +contar = 0 +click_lectura = 0 +clik_stop = 0 +clik_inicio =0 +def iniciar_pausar(): + global mi, se, ml, contar, clik_stop, clik_inicio + ml = ml + 1 + if ml == 999: + ml = 0 + se = se + 1 + if se ==59: + se = 0 + mi = mi + 1 + contar = inicio.after(1, iniciar_pausar) + clik_inicio = inicio.grid_forget() + if clik_inicio is None: + stop.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') + stop.config(bg= 'orange', text= 'DETENER') +def stop_boton(): + global contar, clik_stop + clik_stop = stop.grid_forget() + if clik_stop is None : + inicio.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') + inicio.config(bg= 'aqua', text='CONTINUAR') + inicio.after_cancel(contar) +def vueltas(): + global mi, se, ml,click_lectura + + click_lectura = click_lectura + 1 + if click_lectura == 1: + lectura1.config(text='{} → {}:{}:{}'.format(click_lectura, mi,se,ml), + fg = 'white', bg='gray10') + elif click_lectura ==2: + lectura2.config(text='{} → {}:{}:{}'.format(click_lectura, mi,se,ml), + fg = 'white', bg='gray10') + elif click_lectura ==3: + lectura3.config(text='{} → {}:{}:{}'.format(click_lectura, mi,se,ml), + fg = 'white', bg='gray10') + elif click_lectura ==4: + lectura4.config(text='{} → {}:{}:{}'.format(click_lectura, mi,se,ml), + fg = 'white', bg='gray10') + elif click_lectura == 5: + lectura5.config(text='{} → {}:{}:{}'.format(click_lectura, mi,se,ml), + fg = 'white', bg='gray10') + elif click_lectura ==6: + lectura6.config(text='{} → {}:{}:{}'.format(click_lectura, mi,se,ml), + fg = 'white', bg='gray10') + click_lectura = 0 +def reiniciar(): + global mi, se, ml, contar, click_lectura + mi = 0 + se = 0 + ml = 0 + click_lectura = 0 + inicio.after_cancel(contar) + lectura1.configure(text='Lectura 1', fg = 'white', bg='gray10') + lectura2.configure(text='Lectura 2', fg = 'white', bg='gray10') + lectura3.configure(text='Lectura 3', fg = 'white', bg='gray10') + lectura4.configure(text='Lectura 4', fg = 'white', bg='gray10') + lectura5.configure(text='Lectura 5', fg = 'white', bg='gray10') + lectura6.configure(text='Lectura 6', fg = 'white', bg='gray10') + stop.grid_forget() + inicio.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') + inicio.config(bg= 'green2', text='INICIAR') +def coordenadas(): + x = canvas1.winfo_width() + y = canvas1.winfo_height() + x1 = int(x - 0.1*x - 0.1*y + 25) + y1 = int(y - 0.1*x - 0.1*y + 20) + x2 = int(x - 0.4*x - 0.4*y - 15) + y2 = int(y - 0.4*x - 0.4*y - 30) + tamano = int( y1*0.2 + x1*0.1 + 10 ) + tamano_texto = int( y1*0.02 + x1*0.02 + 3 ) + #print(x1, y1, x2, y2) + canvas1.coords(circulo1, x1,y1,x2,y2) + canvas2.coords(circulo2, x1,y1,x2,y2) + canvas3.coords(circulo3, x1,y1,x2,y2) + + #cordenas numeros + z1 = int(x1*0.6- 10) + z2 = int(y1*0.6 - 10) + #coordenadas texto + w1 = int(x1*0.49 + 8) + w2 = int(y1*0.8 + 10) + canvas1.coords(texto1, z1, z2) + canvas2.coords(texto2, z1, z2) + canvas3.coords(texto3, z1, z2) + canvas1.itemconfig(texto1, font=('Arial',tamano,'bold'),text= mi) + canvas2.itemconfig(texto2, font=('Arial',tamano,'bold'),text= se ) + canvas3.itemconfig(texto2, font=('Arial',tamano,'bold'), text= ml) + canvas1.coords(texto_minutos, w1, w2) + canvas2.coords(texto_segundos, w1, w2) + canvas3.coords(texto_milisegundos, w1, w2) + canvas1.itemconfig(texto_minutos, font=('Arial',tamano_texto,'bold')) + canvas2.itemconfig(texto_segundos, font=('Arial',tamano_texto,'bold')) + canvas3.itemconfig(texto_milisegundos, font=('Arial',tamano_texto,'bold')) + + canvas1.after(1000, coordenadas) + +frame4.columnconfigure([0,1,2,3,4,5], weight= 1) +frame4.rowconfigure(0, weight= 1) + +lectura1 = Label(frame4, text='Lectura 1', fg = 'white', bg='gray10') +lectura1.grid(column=0,row=0, sticky='nsew') +lectura2 = Label(frame4, text='Lectura 2', fg = 'white', bg='gray10') +lectura2.grid(column=1,row=0, sticky='nsew') +lectura3 = Label(frame4, text='Lectura 3', fg = 'white', bg='gray10') +lectura3.grid(column=2,row=0, sticky='nsew') +lectura4 = Label(frame4, text='Lectura 4', fg = 'white', bg='gray10') +lectura4.grid(column=3,row=0, sticky='nsew') +lectura5 = Label(frame4, text='Lectura 5', fg = 'white', bg='gray10') +lectura5.grid(column=4,row=0, sticky='nsew') +lectura6 = Label(frame4, text='Lectura 6', fg = 'white', bg='gray10') +lectura6.grid(column=5,row=0, sticky='nsew') + +frame5.columnconfigure([0,1,2], weight= 1) +frame5.rowconfigure(0, weight= 1) + +stop = Button(frame5, text = 'DETENER', relief = "raised",bd=5, bg='orange', + font=('Arial', 12, 'bold'), width =20, command = stop_boton) +stop.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') +inicio = Button(frame5, text = 'INICIAR',relief = "raised",bd=5, bg='green2', + font=('Arial', 12, 'bold'), width =20, command = iniciar_pausar) +inicio.grid(column=0, row=0, padx =10, pady=10, sticky='nsew') +vuelta = Button(frame5, text = 'VUELTA',relief = "raised", bd=4, bg='blue2', + font=('Arial', 12, 'bold'), width =20, command = vueltas) +vuelta.grid(column=1, row=0,padx =10, pady=10, sticky='nsew') +fin = Button(frame5, text = 'RESTABLECER',relief = "raised",bd=4, bg='red2', + font=('Arial', 12, 'bold'), width =20, command = reiniciar) +fin.grid(column=2, row=0, padx =10, pady=10, sticky='nsew') + +coordenadas() +ventana.mainloop() diff --git a/Efecto Matrix/main.py b/Efecto Matrix/main.py new file mode 100644 index 0000000..7423417 --- /dev/null +++ b/Efecto Matrix/main.py @@ -0,0 +1,66 @@ +# Efecto Matrix +# @autor: Magno Efren +# Youtube: https://www.youtube.com/c/MagnoEfren + +from tkinter import Frame, Tk, Canvas +from random import choice + +class Matrix(Frame): + def __init__(self, master): + super().__init__(master) + + self.canvas = Canvas(master, bg= 'black') + self.canvas.place(relx=0, rely=0, relwidth=1, relheight=1) + + self.velocidad = [i for i in range(0,30,5)] + self.pos = [i for i in range(-200,200,20)] + self.letters = [] + self.green = 0 + self.caracteres = [ + "a", "k", "u", "u", "u", "И", "Ч", + "b", "l", "v", "v", "v", "Ѳ", "Р", + "c", "m", "w", "w", "w", "І", "С", + "d", "n", "x", "x", "x", "К", "Т", + "e", "o", "y", "y", "y", "Л", "Ѵ", + "f", "p", "z", "z", "z", "М", "Ф", + "g", "q", "1", "1", "1", "Н", "Х", + "h", "r", "2", "2", "2", "Ѯ", "Ѱ", + "i", "s", "3", "3", "3", "Ѻ", "Ѿ", + "j", "t", "4", "4", "4", "П", "Ц", + ] + + self.draw() + self.update() + + def draw(self): + for x in range(0,1600,20): + y = choice(self.pos) + for j in range(0, choice([180,220,280]),20): + self.obj = self.canvas.create_text(20+x, -200+y+j, text= choice(self.caracteres), + fill = 'green2', font= ('Arial', 14)) + self.letters.append(self.obj) + def update(self): + for letter in self.letters: + v = choice(self.velocidad) + self.green +=5 + color = '#{:02x}{:02x}{:02x}'.format(0,self.green,0) + self.canvas.itemconfig(letter, fill=color) + self.canvas.move(letter, 0, v) + y = self.canvas.coords(self.obj) + + if self.green >=250: + self.green = 0 + if y[1] >=800: + self.draw() + if y[1]>= 1200: + self.letters.clear() + self.canvas.delete('all') + self.canvas.after(80, self.update) + +if __name__ == '__main__': + root = Tk() + root.title('Matrix Animation') + root.config(bg= 'black') + root.attributes('-fullscreen', True) + app = Matrix(root) + app.mainloop() diff --git a/FlappyBird/audio/die.wav b/FlappyBird/audio/die.wav new file mode 100644 index 0000000..9b79fbd Binary files /dev/null and b/FlappyBird/audio/die.wav differ diff --git a/FlappyBird/audio/hit.wav b/FlappyBird/audio/hit.wav new file mode 100644 index 0000000..9d9b77c Binary files /dev/null and b/FlappyBird/audio/hit.wav differ diff --git a/FlappyBird/audio/point.wav b/FlappyBird/audio/point.wav new file mode 100644 index 0000000..9cf19fe Binary files /dev/null and b/FlappyBird/audio/point.wav differ diff --git a/FlappyBird/audio/swoosh.wav b/FlappyBird/audio/swoosh.wav new file mode 100644 index 0000000..bcae63e Binary files /dev/null and b/FlappyBird/audio/swoosh.wav differ diff --git a/FlappyBird/audio/wing.wav b/FlappyBird/audio/wing.wav new file mode 100644 index 0000000..9ae2c67 Binary files /dev/null and b/FlappyBird/audio/wing.wav differ diff --git a/FlappyBird/images/bird.png b/FlappyBird/images/bird.png new file mode 100644 index 0000000..94a31d9 Binary files /dev/null and b/FlappyBird/images/bird.png differ diff --git a/FlappyBird/images/pipe.png b/FlappyBird/images/pipe.png new file mode 100644 index 0000000..27d113f Binary files /dev/null and b/FlappyBird/images/pipe.png differ diff --git a/FlappyBird/images/reiniciar.png b/FlappyBird/images/reiniciar.png new file mode 100644 index 0000000..429b034 Binary files /dev/null and b/FlappyBird/images/reiniciar.png differ diff --git a/FlappyBird/main.py b/FlappyBird/main.py new file mode 100644 index 0000000..bbe16fc --- /dev/null +++ b/FlappyBird/main.py @@ -0,0 +1,127 @@ +from PIL import Image, ImageTk +import tkinter as tk +from pygame import mixer +import random + +mixer.init() +window = tk.Tk() +window.geometry('1000x600') +window.title('Flappy Bird') + +x = 150 +y = 300 +score = 0 +speed = 10 +game_over = False + +img_bird = Image.open('images/bird.png') +img_bird = ImageTk.PhotoImage(img_bird) + +img_pipe_down = Image.open('images/pipe.png') # 104x900 +img_pipe_top = img_pipe_down.rotate(180) + +img_pipe_down = ImageTk.PhotoImage(img_pipe_down) +img_pipe_top = ImageTk.PhotoImage(img_pipe_top) + +img_reset = Image.open('images/reiniciar.png') +img_reset = ImageTk.PhotoImage(img_reset) + +canvas = tk.Canvas(window, highlightthickness=0, bg= '#00bfff') +canvas.place(relwidth = 1, relheight=1) + +text_score = canvas.create_text(50,50, text= '0', fill='white', font=('D3 Egoistism outline', 30)) + +bird = canvas.create_image(x,y, anchor = 'nw', image =img_bird) +pipe_top = canvas.create_image(1200, -550, anchor= 'nw', image = img_pipe_top) +pipe_down = canvas.create_image(1200, 550, anchor= 'nw', image = img_pipe_down) + +mixer.music.load('audio/swoosh.wav') +mixer.music.play(loops= 0) + +def move_bird_key(event): + global x,y + if not game_over: + y -=30 + canvas.coords(bird, x,y) + mixer.music.load('audio/wing.wav') + mixer.music.play(loops= 0) + + +window.bind( "", move_bird_key) + + +def move_bird(): + global x,y + y +=5 + canvas.coords(bird, x,y) + if y<0 or y> window.winfo_height(): + game_end() + + if not game_over: + window.after(50, move_bird) + +def move_pipe(): + global score, game_over, speed + canvas.move(pipe_top, -speed, 0) + canvas.move(pipe_down, -speed, 0) + if canvas.coords(pipe_down)[0] < -100: + score += 1 + speed += 1 + canvas.itemconfigure(text_score, text = str(score)) + h = window.winfo_height() + num = random.choice([i for i in range(160,h, 160)]) + canvas.coords(pipe_down, window.winfo_width(), num+160) + canvas.coords(pipe_top, window.winfo_width(), num-900) + + if 0 < canvas.coords(pipe_down)[0]<160: + channel = mixer.Channel(1) + channel.set_volume(1.0) + sound = mixer.Sound('audio/point.wav') + channel.play(sound, loops= 0) + + if canvas.coords(pipe_down): + if canvas.bbox(bird)[0] < canvas.bbox(pipe_down)[2] and canvas.bbox(bird)[2]> canvas.bbox(pipe_down)[0]: + if canvas.bbox(bird)[1] < canvas.bbox(pipe_top)[3] or canvas.bbox(bird)[3]> canvas.bbox(pipe_down)[1]: + game_end() + if not game_over: + window.after(50, move_pipe) + + +def reset_game(): + global x,y,score, speed, game_over + x = 150 + y = 300 + score = 0 + speed = 10 + game_over = False + canvas.coords(bird, x,y) + canvas.coords(pipe_top, 1200,-550) + canvas.coords(pipe_down, 1200, 550) + canvas.itemconfigure(text_score, text ="0") + lbl_game_over.place_forget() + bt_reset.place_forget() + move_bird() + move_pipe() + mixer.music.load('audio/swoosh.wav') + mixer.music.play(loops= 0) + +def game_end(): + global game_over + game_over = True + lbl_game_over.place(relx =0.5, rely =0.5, anchor='center') + bt_reset.place(relx = 0.5, rely = 0.7, anchor ='center') + mixer.music.load('audio/hit.wav') + mixer.music.play(loops= 0) + while mixer.music.get_busy(): + continue + mixer.music.load('audio/die.wav') + mixer.music.play(loops= 0) + +lbl_game_over = tk.Label(window, text = 'Game Over !', font= ('D3 Egoistism outline', 30), fg='white', bg='#00bfff') +bt_reset = tk.Button(window, border = 0, image= img_reset, activebackground='#00bfff', bg= '#00bfff', command = reset_game) + +window.after(50, move_bird) +window.after(50, move_pipe) + +window.call('wm', 'iconphoto', window._w, img_bird) +window.mainloop() diff --git a/GUI API OpenAI/assets/icon.png b/GUI API OpenAI/assets/icon.png new file mode 100644 index 0000000..36d8030 Binary files /dev/null and b/GUI API OpenAI/assets/icon.png differ diff --git a/GUI API OpenAI/assets/save.png b/GUI API OpenAI/assets/save.png new file mode 100644 index 0000000..6aff5ab Binary files /dev/null and b/GUI API OpenAI/assets/save.png differ diff --git a/GUI API OpenAI/assets/send.png b/GUI API OpenAI/assets/send.png new file mode 100644 index 0000000..510fe9b Binary files /dev/null and b/GUI API OpenAI/assets/send.png differ diff --git a/GUI API OpenAI/main.py b/GUI API OpenAI/main.py new file mode 100644 index 0000000..534c194 --- /dev/null +++ b/GUI API OpenAI/main.py @@ -0,0 +1,91 @@ +# Youtube: Magno Efren + +from tkinter import Tk, Frame, Button,PhotoImage,Label,Text +from tkinter.scrolledtext import ScrolledText +from tkinter import filedialog, messagebox +from customtkinter import CTk, CTkButton +import openai #pip install openai + +openai.api_key ="OPENAI_API_KEY" + +def generate_text(prompt): + try: + response = openai.Completion.create( + model="text-davinci-003", + prompt=prompt, + temperature=0.7, + max_tokens=100, + top_p=1, + frequency_penalty=0, + presence_penalty=0, + ) + return response.choices[0].text + except Exception as e: + return 'No se conecto a la IA' + +def save_file(): + text = text_out.get("1.0", 'end') + file_path = filedialog.asksaveasfilename(defaultextension=".txt") + with open(file_path, "w") as file: + file.write(text) + + +def show_data(): + question = text_in.get('1.0', 'end') + if len(question) != 0: + text_in.delete('1.0', 'end') + question_show = '\n' + 'YO: ' + '\n' + question + text_out.insert('end', question_show) + res = generate_text(question) + res = 'IA: ' + res #'\n' + text_out.insert('end', res) + else: + messagebox.showerror('Error', 'No se logro comunicar') + +window = CTk() +window.geometry('600x400+400+100') +window.title('Aplicación ChatGTP') +window.config(bg='black') +window.minsize(500, 300) +window.iconphoto(False, PhotoImage(file='assets/icon.png')) + +img_save = PhotoImage(file= 'assets/save.png') +img_send = PhotoImage(file= 'assets/send.png') + + +frame_text = Frame(window, bg= 'white', width=400, height=400) +frame_text.grid(column=0, row=0, sticky='nsew', pady = 5, padx=5) +frame_control = Frame(window, bg= 'black', width=200, height=400) +frame_control.grid(column=1, row=0, sticky='nsew', pady = 5, padx=5) + +window.columnconfigure(0, weight=6) +window.columnconfigure(1, weight=1) +window.rowconfigure(0, weight=1) + +frame_text.grid_propagate(0) +frame_control.grid_propagate(0) + +frame_text.columnconfigure(0, weight=1) +frame_text.rowconfigure(0, weight=1) + +frame_control.columnconfigure(0, weight=1) +frame_control.rowconfigure([0,1,2], weight=1) + +text_out = ScrolledText(frame_text, font = ('Arial', 12), insertbackground= 'blue', + bg= 'black', fg= 'white') +text_out.grid(column=0, row=0, sticky= 'nsew') + +text_in = Text(frame_control, font = ('Arial', 12), insertbackground= 'blue', + bg= 'black', fg= 'white', height=12) +text_in.grid(column=0, row=0) + +button_send = CTkButton(frame_control,image = img_send,compound= 'left',text= ' ENVIAR', + text_font= ('Arial', 11, 'bold') , fg_color= 'blue', command= show_data) +button_send.grid(column = 0, row=1, sticky='nsew',pady = 15, padx=15) + +button_save = CTkButton(frame_control,image = img_save,compound= 'left',text= 'GUARDAR', + text_font= ('Arial', 11, 'bold') , fg_color= 'blue', command= save_file) +button_save.grid(column = 0, row=2, sticky='nsew',pady = 15, padx=15) + + +window.mainloop() \ No newline at end of file diff --git a/Juego Snake/juego Snake.py b/Juego Snake/Snake.py similarity index 95% rename from Juego Snake/juego Snake.py rename to Juego Snake/Snake.py index 0449d40..7637e79 100644 --- a/Juego Snake/juego Snake.py +++ b/Juego Snake/Snake.py @@ -1,13 +1,11 @@ # Juego Snake # @autor: Magno Efren # Youtube: https://www.youtube.com/c/MagnoEfren - #print('🟢❤🍎🌍💛💚🧡🧡❤💥⚪🟥🟧🟨🟩🟦🟫🟪🔶🔸🔷🔹🔺🔻') from tkinter import Tk, Frame, Canvas, Button,Label, IntVar, ALL import random from pygame import mixer - x, y =15,15 direction = '' posicion_x = 15 @@ -15,13 +13,10 @@ posicion_food = (15,15) posicion_snake = [(75,75)] nueva_posicion =[(15,15)] - mixer.init() - def coordenadas_snake(): global direccion, posicion_snake,x,y ,nueva_posicion - if direction =='up': # arriba y = y-30 nueva_posicion[0:] = [(x, y)] @@ -50,15 +45,12 @@ def coordenadas_snake(): x=15 elif x <=0: x=15 - posicion_snake = nueva_posicion + posicion_snake[:-1] - for parte, lugar in zip(canvas.find_withtag("snake"), posicion_snake): canvas.coords(parte, lugar) def direccion(event): global direction - if event == 'left': if direction != 'right': direction = event @@ -71,31 +63,22 @@ def direccion(event): elif event == 'down': if direction != 'up': direction = event - def movimiento(): global posicion_food, posicion_snake,nueva_posicion posiciones = [15, 45, 75,105,135,165, 195, 225, 255, 285, 315, 345, 375, 405, 435, 465] - coordenadas_snake() - if posicion_food == posicion_snake[0]: n = len(posicion_snake) - cantidad['text'] = 'Cantidad 🍎 : {}'.format(n) - posicion_food = (random.choice(posiciones), random.choice(posiciones)) posicion_snake.append(posicion_snake[-1]) - mixer.music.load("audio_snake.mp3") mixer.music.play(loops=0) - if posicion_food not in posicion_snake: canvas.coords(canvas.find_withtag("food"), posicion_food) - canvas.create_text(*posicion_snake[-1], text= '▀', fill='green2', font = ('Arial',20), tag ='snake') - if posicion_snake[-1] == nueva_posicion[0] and len(posicion_snake)>=4: cruzar_snake() @@ -105,7 +88,6 @@ def movimiento(): cantidad.after(300, movimiento) - def cruzar_snake(): canvas.delete(ALL) canvas.create_text(canvas.winfo_width() / 2, canvas.winfo_height() / 2, @@ -122,7 +104,6 @@ def salir (): ventana.destroy() ventana.quit() - ventana = Tk() ventana.config(bg='black') ventana.title('Juego Snake') @@ -139,7 +120,6 @@ def salir (): ventana.bind("", lambda event:direccion('down')) ventana.bind("", lambda event:direccion('left')) ventana.bind("", lambda event:direccion('right')) - canvas = Canvas(frame_2, bg='black', width=479, height=479) canvas.pack() @@ -147,7 +127,6 @@ def salir (): for j in range(0,460,30): canvas.create_rectangle(i,j,i+30, j+30, fill='gray10') - canvas.create_text(75,75, text='🍎', fill='red2', font = ('Arial',18), tag = 'food') diff --git a/Leer datos de Excel/pandas_leer_datos.py b/Leer datos de Excel/pandas_leer_datos.py new file mode 100644 index 0000000..fd8035e --- /dev/null +++ b/Leer datos de Excel/pandas_leer_datos.py @@ -0,0 +1,116 @@ +# Abrir hoja de excel desde una GUI en Tkinter +# @autor: Magno Efren +# Youtube: https://www.youtube.com/c/MagnoEfren + +from tkinter import Tk, Label, Button, Frame, messagebox, filedialog, ttk, Scrollbar, VERTICAL, HORIZONTAL +import pandas as pd + + +ventana = Tk() +ventana.config(bg='black') +ventana.geometry('600x400') +ventana.minsize(width=600, height=400) +ventana.title('Leer datos de Excel') + +ventana.columnconfigure(0, weight = 25) +ventana.rowconfigure(0, weight= 25) +ventana.columnconfigure(0, weight = 1) +ventana.rowconfigure(1, weight= 1) + +frame1 = Frame(ventana, bg='gray26') +frame1.grid(column=0,row=0,sticky='nsew') +frame2 = Frame(ventana, bg='gray26') +frame2.grid(column=0,row=1,sticky='nsew') + +frame1.columnconfigure(0, weight = 1) +frame1.rowconfigure(0, weight= 1) + +frame2.columnconfigure(0, weight = 1) +frame2.rowconfigure(0, weight= 1) +frame2.columnconfigure(1, weight = 1) +frame2.rowconfigure(0, weight= 1) + +frame2.columnconfigure(2, weight = 1) +frame2.rowconfigure(0, weight= 1) + +frame2.columnconfigure(3, weight = 2) +frame2.rowconfigure(0, weight= 1) + + +def abrir_archivo(): + + archivo = filedialog.askopenfilename(initialdir ='/', + title='Selecione archivo', + filetype=(('xlsx files', '*.xlsx*'),('All files', '*.*'))) + indica['text'] = archivo + + +def datos_excel(): + + datos_obtenidos = indica['text'] + try: + archivoexcel = r'{}'.format(datos_obtenidos) + + + df = pd.read_excel(archivoexcel) + + except ValueError: + messagebox.showerror('Informacion', 'Formato incorrecto') + return None + + except FileNotFoundError: + messagebox.showerror('Informacion', 'El archivo esta \n malogrado') + return None + + Limpiar() + + tabla['column'] = list(df.columns) + tabla['show'] = "headings" #encabezado + + + for columna in tabla['column']: + tabla.heading(columna, text= columna) + + + df_fila = df.to_numpy().tolist() + for fila in df_fila: + tabla.insert('', 'end', values =fila) + + +def Limpiar(): + tabla.delete(*tabla.get_children()) + + + +tabla = ttk.Treeview(frame1 , height=10) +tabla.grid(column=0, row=0, sticky='nsew') + +ladox = Scrollbar(frame1, orient = HORIZONTAL, command= tabla.xview) +ladox.grid(column=0, row = 1, sticky='ew') + +ladoy = Scrollbar(frame1, orient =VERTICAL, command = tabla.yview) +ladoy.grid(column = 1, row = 0, sticky='ns') + +tabla.configure(xscrollcommand = ladox.set, yscrollcommand = ladoy.set) + +estilo = ttk.Style(frame1) +estilo.theme_use('clam') # ('clam', 'alt', 'default', 'classic') +estilo.configure(".",font= ('Arial', 14), foreground='red2') +estilo.configure("Treeview", font= ('Helvetica', 12), foreground='black', background='white') +estilo.map('Treeview',background=[('selected', 'green2')], foreground=[('selected','black')] ) + + +boton1 = Button(frame2, text= 'Abrir', bg='green2', command= abrir_archivo) +boton1.grid(column = 0, row = 0, sticky='nsew', padx=10, pady=10) + +boton2 = Button(frame2, text= 'Mostrar', bg='magenta', command= datos_excel) +boton2.grid(column = 1, row = 0, sticky='nsew', padx=10, pady=10) + +boton3 = Button(frame2, text= 'Limpiar', bg='red', command= Limpiar) +boton3.grid(column = 2, row = 0, sticky='nsew', padx=10, pady=10) + + +indica = Label(frame2, fg= 'white', bg='gray26', text= 'Ubicación del archivo', font= ('Arial',10,'bold') ) +indica.grid(column=3, row = 0) + +ventana.mainloop() diff --git a/Login/login.py b/Login/login.py index a7df1d2..ede602a 100644 --- a/Login/login.py +++ b/Login/login.py @@ -11,27 +11,21 @@ class Login(Frame): def __init__(self, master, *args): super().__init__( master,*args) - self.user_marcar = "Ingrese su correo" self.contra_marcar = "Ingrese su contraseña" self.fila1 = '' self.fila2 = '' self.datos = conexion.Registro_datos() self.widgets() - def entry_out(self, event, event_text): if event['fg'] == 'black' and len(event.get()) ==0: event.delete(0, END) event['fg'] = 'grey' event.insert(0, event_text) - if self.entry2.get() != 'Ingrese su contraseña': self.entry2['show'] ="" - if self.entry2.get() != 'Ingrese su correo': self.entry2['show'] ="*" - - def entry_in(self, event): if event['fg'] == 'grey': event['fg'] = 'black' @@ -64,7 +58,6 @@ def acceder_ventana_dos(self): Label(self.ventana_dos, text='VENTANA DOS', font='Arial 40', bg= 'white').pack(expand=True) Button(self.ventana_dos, text='Salir', font='Arial 10', bg= 'red', command= self.salir).pack(expand=True) - def verificacion_users(self): self.indica1['text'] = '' self.indica2['text'] = '' @@ -120,17 +113,14 @@ def widgets(self): # contraseña y entry Label(self.master, text= 'Contraseña', bg='DarkOrchid1', fg= 'black', font= ('Lucida Sans', 16, 'bold')).pack(pady=5) self.entry2 = Entry(self.master,font=('Comic Sans MS', 12),justify = 'center', fg='grey',highlightbackground = "#E65561", - highlightcolor= "green2", highlightthickness=5) + highlightcolor= "green2", highlightthickness=5) self.entry2.insert(0, self.contra_marcar) self.entry2.bind("", lambda args: self.entry_in(self.entry2)) self.entry2.bind("", lambda args: self.entry_out(self.entry2, self.contra_marcar)) self.entry2.pack(pady=4) - self.indica2 = Label(self.master, bg='DarkOrchid1', fg= 'black', font= ('Arial', 8, 'bold')) self.indica2.pack(pady=2) - Button(self.master, text= 'Iniciar Sesion', command = self.verificacion_users,activebackground='magenta', bg='#D64E40', font=('Arial', 12,'bold')).pack(pady=10) - estilo = ttk.Style() estilo.theme_use('clam') estilo.configure("TProgressbar", foreground='red', background='black',troughcolor='DarkOrchid1', diff --git a/Login/login_datos.sql b/Login/login_datos.sql new file mode 100644 index 0000000..c5f29fe --- /dev/null +++ b/Login/login_datos.sql @@ -0,0 +1,12 @@ + +CREATE DATABASE IF NOT EXISTS `base_datos` ; +USE `base_datos`; + +-- Volcando estructura para tabla base_datos.login_datos +CREATE TABLE IF NOT EXISTS `login_datos` ( + `Id` int NOT NULL AUTO_INCREMENT, + `Users` varchar(50) NOT NULL DEFAULT '0', + `Password` varchar(50) NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; + diff --git a/Menu lateral desplegable/main.py b/Menu lateral desplegable/main.py index 0c07ad2..c3405b0 100644 --- a/Menu lateral desplegable/main.py +++ b/Menu lateral desplegable/main.py @@ -13,7 +13,6 @@ def __init__(self, master, *args): self.menu = True self.color = True - self.codigo = StringVar() self.nombre = StringVar() self.modelo = StringVar() @@ -22,7 +21,6 @@ def __init__(self, master, *args): self.buscar = StringVar() self.buscar_actualiza = StringVar() self.id = StringVar() - self.base_datos = Registro_datos() self.frame_inicio = Frame(self.master, bg='black', width=50, height=45) @@ -39,14 +37,11 @@ def __init__(self, master, *args): self.master.rowconfigure(1, weight=1) self.frame_principal.columnconfigure(0, weight=1) self.frame_principal.rowconfigure(0, weight=1) - - - self.widgets() - + self.widgets() def pantalla_inicial(self): self.paginas.select([self.frame_uno]) - + def pantalla_datos(self): self.paginas.select([self.frame_dos]) self.frame_dos.columnconfigure(0, weight=1) @@ -121,7 +116,6 @@ def cambiar_color(self): self.texto.config(bg='white') self.bt_color.config(bg='white',activebackground='white') self.color = True - def widgets(self): self.imagen_inicio = PhotoImage(file ='inicio.png') self.imagen_menu = PhotoImage(file ='menu.png') @@ -136,12 +130,10 @@ def widgets(self): self.imagen_dos= PhotoImage(file ='imagen_dos.png') self.dia = PhotoImage(file ='dia.png') self.noche= PhotoImage(file ='noche.png') - self.bt_inicio = Button(self.frame_inicio, image= self.imagen_inicio, bg='black',activebackground='black', bd=0, command = self.menu_lateral) self.bt_inicio.grid(column=0, row=0, padx=5, pady=10) self.bt_cerrar = Button(self.frame_inicio, image= self.imagen_menu, bg='black',activebackground='black', bd=0, command = self.menu_lateral) self.bt_cerrar.grid(column=0, row=0, padx=5, pady=10) - #BOTONES Y ETIQUETAS DEL MENU LATERAL Button(self.frame_menu, image= self.imagen_datos, bg='black', activebackground='black', bd=0, command = self.pantalla_datos).grid(column=0, row=1, pady=20,padx=10) Button(self.frame_menu, image= self.imagen_registrar, bg='black',activebackground='black', bd=0, command =self.pantalla_escribir ).grid(column=0, row=2, pady=20,padx=10) @@ -155,8 +147,7 @@ def widgets(self): Label(self.frame_menu, text= 'Eliminar', bg= 'black', fg= 'DarkOrchid1', font= ('Lucida Sans', 12, 'bold')).grid(column=1, row=4, pady=20, padx=2) Label(self.frame_menu, text= 'Ajustes', bg= 'black', fg= 'DarkOrchid1', font= ('Lucida Sans', 12, 'bold')).grid(column=1, row=5, pady=20, padx=2) - - ############################# CREAR PAGINAS ############################## + ############################# CREAR PAGINAS ############################## estilo_paginas = ttk.Style() estilo_paginas.configure("TNotebook", background='black', foreground='black', padding=0, borderwidth=0) estilo_paginas.theme_use('default') @@ -180,25 +171,18 @@ def widgets(self): self.paginas.add(self.frame_cuatro) self.paginas.add(self.frame_cinco) self.paginas.add(self.frame_seis) - - ############################## PAGINAS ############################################# ######################## FRAME TITULO ################# self.titulo = Label(self.frame_top,text= 'APLICACION DE ESCRITORIO EN PYTHON CON TKINTER', bg='black', fg= 'DarkOrchid1', font= ('Imprint MT Shadow', 15, 'bold')) self.titulo.pack(expand=1) - ######################## VENTANA PRINCIPAL ################# - Label(self.frame_uno, text= 'Electrónica Programación y Tecnología', bg='DarkOrchid1', fg= 'white', font= ('Freehand521 BT', 20, 'bold')).pack(expand=1) Label(self.frame_uno ,image= self.logo, bg='DarkOrchid1').pack(expand=1) - ######################## MOSTRAR TODOS LOS PRODUCTOS DE LA BASE DE DATOS MYSQL ################# Label(self.frame_dos, text= 'Datos de MySQL', bg='white', fg= 'DarkOrchid1', font= ('Comic Sans MS', 12, 'bold')).grid(column =0, row=0) Button(self.frame_dos, text='ACTUALIZAR',fg='black' ,font = ('Arial', 11,'bold'), command= self.datos_totales, bg = 'green2', bd = 2, borderwidth=2).grid(column=1, row=0, pady=5) - - #ESTILO DE LAS TABLAS DE DATOS TREEVIEW estilo_tabla = ttk.Style() estilo_tabla.configure("Treeview", font= ('Helvetica', 10, 'bold'), foreground='black', background='white') #, fieldbackground='yellow' @@ -206,8 +190,6 @@ def widgets(self): estilo_tabla.configure('Heading',background = 'white', foreground='navy',padding=3, font= ('Arial', 10, 'bold')) estilo_tabla.configure('Item',foreground = 'white', focuscolor ='DarkOrchid1') estilo_tabla.configure('TScrollbar', arrowcolor = 'DarkOrchid1',bordercolor ='black', troughcolor= 'DarkOrchid1',background ='white') - - #TABLA UNO self.frame_tabla_uno = Frame(self.frame_dos, bg= 'gray90') self.frame_tabla_uno.grid(columnspan=3, row=2, sticky='nsew') @@ -286,7 +268,6 @@ def widgets(self): #TABLA DOS self.frame_tabla_dos = Frame(self.frame_cinco, bg= 'gray90') self.frame_tabla_dos.grid(columnspan=4, row=2, sticky='nsew') - self.tabla_dos = ttk.Treeview(self.frame_tabla_dos) self.tabla_dos.grid(column=0, row=0, sticky='nsew') ladox = ttk.Scrollbar(self.frame_tabla_dos, orient = 'horizontal', command= self.tabla_dos.xview) @@ -301,15 +282,12 @@ def widgets(self): self.tabla_dos.column('Modelo', minwidth=100, width=120, anchor='center' ) self.tabla_dos.column('Precio', minwidth=100, width=120 , anchor='center') self.tabla_dos.column('Cantidad', minwidth=100, width=105, anchor='center') - self.tabla_dos.heading('#0', text='Codigo', anchor ='center') self.tabla_dos.heading('Nombre', text='Nombre', anchor ='center') self.tabla_dos.heading('Modelo', text='Modelo', anchor ='center') self.tabla_dos.heading('Precio', text='Precio', anchor ='center') self.tabla_dos.heading('Cantidad', text='Cantidad', anchor ='center') - self.tabla_dos.bind("<>", self.obtener_fila) - - + self.tabla_dos.bind("<>", self.obtener_fila) ######################## AJUSTES ################# self.text_ajustes = Label(self.frame_seis, text = 'Configuracion',fg='purple', bg ='white', font=('Kaufmann BT',28,'bold')) self.text_ajustes.pack(expand=1) @@ -318,8 +296,6 @@ def widgets(self): self.texto = Label(self.frame_seis, text = '@autor:Magno Efren \n Desarrollado en Python',fg='red', bg ='white', font=('Kaufmann BT',18)) self.texto.pack(expand=1) - - def datos_totales(self): datos = self.base_datos.mostrar_productos() self.tabla_uno.delete(*self.tabla_uno.get_children()) @@ -328,7 +304,6 @@ def datos_totales(self): i= i+1 self.tabla_uno.insert('',i, text = datos[i][1:2], values=datos[i][2:6]) - def agregar_datos(self): codigo = self.codigo.get() nombre = self.nombre.get() @@ -354,7 +329,6 @@ def actualizar_datos(self): dato = self.buscar_actualiza.get() dato = str("'" + dato + "'") nombre_buscado = self.base_datos.busca_producto(dato) - if nombre_buscado == []: self.aviso_actualizado['text'] = 'No existe' self.indica_busqueda.update() @@ -372,7 +346,6 @@ def actualizar_datos(self): self.precio.set(nombre_buscado[i][4]) self.cantidad.set(nombre_buscado[i][5]) - def actualizar_tabla(self): Id = self.id.get() codigo = self.codigo.get() @@ -386,8 +359,7 @@ def actualizar_tabla(self): time.sleep(1) self.aviso_actualizado['text'] = '' self.limpiar_datos() - self.buscar_actualiza.set('') - + self.buscar_actualiza.set('') def limpiar_datos(self): self.codigo.set('') self.nombre.set('') @@ -399,19 +371,15 @@ def buscar_nombre(self): nombre_producto = self.buscar.get() nombre_producto = str("'" + nombre_producto + "'") nombre_buscado = self.base_datos.busca_producto(nombre_producto) - if nombre_buscado == []: self.indica_busqueda['text'] = 'No existe' self.indica_busqueda.update() time.sleep(1) self.indica_busqueda['text'] ='' - i = -1 for dato in nombre_buscado: i= i+1 self.tabla_dos.insert('',i, text = nombre_buscado[i][1:2], values=nombre_buscado[i][2:6]) - - def eliminar_fila(self): fila = self.tabla_dos.selection() if len(fila) !=0: @@ -440,7 +408,6 @@ def obtener_fila(self, event): data = self.tabla_dos.item(current_item) self.nombre_borrar = data['values'][0] - if __name__ == "__main__": ventana = Tk() ventana.title('') @@ -449,91 +416,3 @@ def obtener_fila(self, event): ventana.call('wm', 'iconphoto', ventana._w, PhotoImage(file='logo.png')) app = Ventana(ventana) app.mainloop() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -""" - # ,highlightbackground='red',highlightcolor='yellow',activebackground='black',activeforeground='deep sky blue' botonnn - - - - ventana.wm_attributes("-topmost", True) - #Label(self.master, image= self.logo, bg='DarkOrchid1').pack() #,height=150, width=150 - #Label(self.frame_contenido2, text= 'datos', bg='DarkOrchid1', fg= 'black', font= ('Lucida Sans', 16, 'bold')).grid() - #self.entry1 = Entry(self.frame_contenido2, font=('Comic Sans MS', 12),justify = 'center', fg='grey',highlightbackground = "#E65561", - #highlightcolor= "green2", highlightthickness=5) - #self.entry1.pack(pady=5) - - - #ventana.overrideredirect(1) - #ventana.resizable(0,0) - #self.master.attributes('-alpha',0.5) - - mygreen = "black" - myred = "black" - - style = ttk.Style() - - style.theme_create( "yummy", parent="alt", settings={ - "TNotebook": {"configure": {"tabmargins": [0, 0, 0, 0] } }, - "TNotebook.Tab": { - "configure": {"padding": [0, 0], "background": mygreen }, - "map": {"background": [("selected", myred)], - "expand": [("selected", [0, 0, 0, 0])] } } } ) - - style.theme_use("yummy") - - - - - ############################# CREAR PAGINAS ############################## - estilo_paginas = ttk.Style() - estilo_paginas.configure("TNotebook", background='black', foreground='black', padding=0, borderwidth=0) - estilo_paginas.theme_use('default') - estilo_paginas.configure("TNotebook", background='black', borderwidth=0) - estilo_paginas.configure("TNotebook.Tab", background="black", borderwidth=0) - estilo_paginas.map("TNotebook", background=[("selected", 'black')]) - estilo_paginas.map("TNotebook.Tab", background=[("selected", 'black')], foreground=[("selected", 'black')]); - #estilo.configure("TNotebook.Tab", background='red', foreground='red'); - - -""" \ No newline at end of file diff --git a/Paint Tkinter/Paint.py b/Paint Tkinter/Paint.py new file mode 100644 index 0000000..2b42e15 --- /dev/null +++ b/Paint Tkinter/Paint.py @@ -0,0 +1,172 @@ +# @autor Magno Efren +# Youtube: https://www.youtube.com/c/MagnoEfren +# GitHub: https://github.com/MagnoEfren + +from tkinter import Canvas, Tk, Frame, Button,messagebox, filedialog, Scale, HORIZONTAL,ALL +import PIL.ImageGrab as ImageGrab + +linea_x = 0 +linea_y = 0 +color = 'black' + +def linea_xy(event): + global linea_x + global linea_y + + linea_x = event.x + linea_y = event.y + + +def linea(event): + global linea_x, linea_y + canvas.create_line((linea_x, linea_y, event.x, event.y), fill= color, width = espesor_pincel.get()) + linea_x = event.x + linea_y = event.y + + +def mostrar_color(nueva_color): + global color + color = nueva_color + + +def borrar(): + global color + color = 'White' + + +def limpiar(): + canvas.delete(ALL) + + +def salir(): + ventana.destroy() + ventana.quit() + + + +def guardar_dibujo(): + + try: + filename = filedialog.asksaveasfilename(defaultextension='.png') + + x = ventana.winfo_rootx() + canvas.winfo_x() + y = (ventana.winfo_rooty() + canvas.winfo_y()) + + x1 = x + canvas.winfo_width() + y1 = y + canvas.winfo_height() + + ImageGrab.grab().crop((x, y, x1, y1)).save(filename) + messagebox.showinfo('Guardar Dibujo','Imagen guardada en: ' + str(filename) ) + except: + messagebox.showerror('Guardar Dibujo', 'Imagen no guardada\n Error') + + + +ventana = Tk() +ventana.state('zoomed') +ventana.config(bg='black') +ventana.title('Dibujar') +ventana.iconbitmap('icono_dibujo.ico') + +ventana.rowconfigure(0, weight=1) +ventana.columnconfigure(0, weight=1) + +# frame principal comandos y canvas de dibujo + +frame = Frame(ventana, bg='black', height=200) +frame.grid(column =0, row =0, sticky='ew') + +frame.columnconfigure(0, minsize=200, weight=1) + + +# canvas de dibujo +canvas = Canvas(ventana, height=660 , bg= 'white' ) +canvas.grid(row=1,column=0, sticky='nsew') + + +canvas.rowconfigure(0,weight=1) +canvas.columnconfigure(0, weight=1, minsize=100) + +canvas.bind('', linea_xy) +canvas.bind('', linea) + + +# Canvas para colores + +canvas_colores = Canvas(frame, bg='black', width=5, height=40) +canvas_colores.grid(column =0, row =0, sticky='ew', padx=1, pady=1) + + +id = canvas_colores.create_rectangle((10,10,30,30),fill ='red') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('red')) + +id = canvas_colores.create_rectangle((40,10,60,30),fill ='green') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('green')) + +id = canvas_colores.create_rectangle((70,10,90,30),fill ='yellow') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('yellow')) + +id = canvas_colores.create_rectangle((100,10,120,30),fill ='magenta') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('magenta')) + +id = canvas_colores.create_rectangle((130,10,150,30),fill ='blue') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('blue')) + +id = canvas_colores.create_rectangle((160,10,180,30),fill ='orange') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('orange')) + +id = canvas_colores.create_rectangle((190,10,210,30),fill ='salmon') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('salmon')) + +id = canvas_colores.create_rectangle((220,10,240,30),fill ='sky blue') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('sky blue')) + +id = canvas_colores.create_rectangle((250,10,270,30),fill ='gold') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('gold')) + +id = canvas_colores.create_rectangle((280,10,300,30),fill ='hot pink') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('hot pink')) + +id = canvas_colores.create_rectangle((310,10,330,30),fill ='bisque') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('bisque')) + +id = canvas_colores.create_rectangle((340,10,360,30),fill ='brown4') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('brown4')) + +id = canvas_colores.create_rectangle((370,10,390,30),fill ='gray') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('gray')) + +id = canvas_colores.create_rectangle((400,10,420,30),fill ='purple') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('purple')) + +id = canvas_colores.create_rectangle((430,10,450,30),fill ='green2') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('green2')) + +id = canvas_colores.create_rectangle((460,10,480,30),fill ='dodger blue') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('dodger blue')) + +id = canvas_colores.create_rectangle((490,10,510,30),fill ='black') +canvas_colores.tag_bind(id, '', lambda x: mostrar_color('black')) + +# botones y scale de control + +espesor_pincel = Scale(frame, orient= HORIZONTAL, from_ = 0, to=50, length=200 ,relief= 'groove', bg='gold', width=17, sliderlength=20, highlightbackground='white',activebackground='red') +espesor_pincel.set(1) +espesor_pincel.grid(column=1, row=0, sticky='ew', pady=1, padx=2) + + +bt_guardar = Button(frame, text ='Guardar', bg='green2', command = guardar_dibujo, width=10, height=2,activebackground='white', font=('Comic sens MS',10,'bold')) +bt_guardar.grid(column=2, row=0, sticky='ew',pady=1,padx=4) + +bt_borrar = Button(frame, text ='Borrar', bg='cyan2', command = borrar, width=10, height=2,activebackground='white',font=('Comic sens MS',10,'bold')) +bt_borrar.grid(column=3, row=0, sticky='ew', pady=1, padx=4) + + +bt_limpiar = Button(frame, text ='Limpiar', bg='violet red', command = limpiar, width=10, height=2,activebackground='white',font=('Comic sens MS',10,'bold')) +bt_limpiar.grid(column=4, row=0, sticky='ew', pady=1, padx=4) + +bt_salir = Button(frame, text ='Salir', bg='firebrick1', command = salir, width=10, height=2, activebackground='white',font=('Comic sens MS',10,'bold')) +bt_salir.grid(column=5, row=0, sticky='ew',pady=1, padx=4) + + +ventana.mainloop() \ No newline at end of file diff --git a/Paint Tkinter/icono_dibujo.ico b/Paint Tkinter/icono_dibujo.ico new file mode 100644 index 0000000..cad4ac7 Binary files /dev/null and b/Paint Tkinter/icono_dibujo.ico differ diff --git a/ProgressBar Circular/main_progress.py b/ProgressBar Circular/main_progress.py index 9415952..25055a8 100644 --- a/ProgressBar Circular/main_progress.py +++ b/ProgressBar Circular/main_progress.py @@ -44,7 +44,6 @@ def progressBar(): fill='deep sky blue',width=20) canvas.create_line(300,300, 300 + 150*sin(radians(8)), 300 - 150*cos(radians(8)), fill='deep sky blue',width=20) - canvas.create_oval(150,150,450,450, fill= '', outline='dark violet', width= 6) canvas.create_oval(180,180,420,420, fill='gray22', outline='dark violet', width=6) @@ -57,45 +56,11 @@ def progressBar(): ventana.after(100,progressBar) - scale1 = ttk.Scale(ventana, orient= 'horizontal', style="Horizontal.TScale", from_ = 0, to=360, length=400) scale1.set(0) scale1.grid(column=1, row=1, pady=10, padx=5) - style = ttk.Style() style.configure("Horizontal.TScale", background="black") - Button(ventana, text= 'Iniciar', bg= 'green2',width=20, command= progressBar).grid(column=0,row=1, padx=3, pady=5) -ventana.mainloop() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +ventana.mainloop() diff --git a/README.md b/README.md new file mode 100644 index 0000000..741cb86 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +
+ +# Interfaces Graficas en Python con Tkinter +Entre estas y muchas mas aplicaciones realizas con Tkinter en Python encontraras en Youtube + + + + + +### Login (Inicio de sesión) en Python con Tkinter - Validación de datos MySQL +![1](https://github.com/MagnoEfren/gui_python_tkinter/blob/main/Login/login-tkinter.png ) + + + +### Cronometro en Python usando Tkinter - GUI +![2](https://github.com/MagnoEfren/gui_python_tkinter/blob/main/Cronometro/cronometro-en-python.png) + + + + +### Grafica del Seno en Tkinter con Matplotlib | Variar la Amplitud con Slider +![3](https://github.com/MagnoEfren/gui_python_tkinter/blob/main/Tkinter%20y%20Matplotlib%20Grafica%20Seno%20-%20Slider/matplotlib-tkinter.png) + + + + +### Interfaz Grafica en Tkinter con Base de Datos MySQL - Registro de Productos +![4](https://github.com/MagnoEfren/gui_python_tkinter/blob/main/Base%20de%20datos%20MySQL/tkinter-mysql.png) + + + +
+ + diff --git a/Reloj transparente/reloj.py b/Reloj transparente/reloj.py index 092fb1f..6df3d4b 100644 --- a/Reloj transparente/reloj.py +++ b/Reloj transparente/reloj.py @@ -6,9 +6,10 @@ ventana = Tk() ventana.config(bg='gray') -ventana.wm_attributes( - '-transparentcolor', 'gray') -ventana.overrideredirect(1) # Eliminar el borde de la ventana +ventana.wm_attributes('-transparentcolor', 'gray') +# ventana.wm_attributes("-alpha", 0.5) Para linux +# ventana.wait_visibility(ventana) Para linux +ventana.overrideredirect(1) # Eliminar barra de titulo def salir(*args): ventana.destroy() diff --git a/Reproductor de Musica/main.py b/Reproductor de Musica/main.py index 7f4aae8..3f8e884 100644 --- a/Reproductor de Musica/main.py +++ b/Reproductor de Musica/main.py @@ -1,6 +1,6 @@ # @autor: Magno Efren # Youtube: https://www.youtube.com/c/MagnoEfren/ -#Reproductor de Musica +# Reproductor de Musica from tkinter import Button, Label,Tk,filedialog, ttk, Frame, PhotoImage import pygame @@ -8,8 +8,8 @@ import mutagen #from mutagen.mp3 import MP3 - #pygame.mixer.pre_init(frequency=44100) + pygame.mixer.init() pygame.mixer.init(frequency=44100) cancion_actual ='' @@ -76,14 +76,13 @@ def iniciar_reproduccion(): tt = minutos*60 + segundos tiempo['maximum']= tt # tiempo total de la cancion texto['text']= str(minutos) + ":" + str(segundos) - + actualizar = ventana.after(100 , iniciar_reproduccion) if x == tt: ventana.after_cancel(actualizar) texto['text']= "00:00" detener_efecto() - if pos != n: pos = pos + 1 ventana.after(100 , iniciar_reproduccion) @@ -93,7 +92,6 @@ def iniciar_reproduccion(): def iniciar(): global cancion_actual - pygame.mixer.music.load(cancion_actual) pygame.mixer.music.play() iniciar_reproduccion() @@ -143,21 +141,15 @@ def stop(): global actualizar pygame.mixer.music.stop() ventana.after_cancel(actualizar) - detener_efecto() - - + detener_efecto() def pausa(): global actualizar pygame.mixer.music.pause() ventana.after_cancel(actualizar) detener_efecto() - - def continuar(): pygame.mixer.music.unpause() ventana.after(100 , iniciar_reproduccion) - - ventana =Tk() ventana.title('Reproductor de Musica') ventana.iconbitmap('icono.ico') diff --git a/Snake_v2/assets/audio_snake.mp3 b/Snake_v2/assets/audio_snake.mp3 new file mode 100644 index 0000000..87028aa Binary files /dev/null and b/Snake_v2/assets/audio_snake.mp3 differ diff --git a/Snake_v2/main.py b/Snake_v2/main.py new file mode 100644 index 0000000..a83f55f --- /dev/null +++ b/Snake_v2/main.py @@ -0,0 +1,360 @@ +# Juego Snake V2 +# @autor: Magno Efren (Optimizado) +# Youtube: https://www.youtube.com/c/MagnoEfren + +from tkinter import Tk, Frame, Canvas, Button, Label, ALL +import random +from pygame import mixer + +class SnakeGame: + def __init__(self, ventana): + self.ventana = ventana + self.configurar_ventana() + + # Variables del juego + self.x = 15 + self.y = 15 + self.direction = '' + self.posicion_snake = [(75, 75)] + self.posicion_food = (15, 15) + self.juego_activo = False + self.juego_pausado = False + self.velocidad = 300 + self.posiciones_validas = [15, 45, 75, 105, 135, 165, 195, 225, 255, + 285, 315, 345, 375, 405, 435, 465] + + # Inicializar mixer + try: + mixer.init() + except: + pass + + # Crear interfaz + self.crear_interfaz() + self.crear_tablero() + + def configurar_ventana(self): + """Configura la ventana principal""" + self.ventana.config(bg='black') + self.ventana.title('Juego Snake - Mejorado') + self.ventana.geometry('485x569') + self.ventana.resizable(0, 0) + + def crear_interfaz(self): + """Crea los frames y controles del juego""" + # Frame superior (controles) + self.frame_controles = Frame(self.ventana, width=485, height=60, bg='black') + self.frame_controles.grid(column=0, row=0, pady=5) + + # Frame del juego + self.frame_juego = Frame(self.ventana, width=485, height=490, bg='black') + self.frame_juego.grid(column=0, row=1) + + # Botones de control + self.btn_iniciar = Button( + self.frame_controles, + text='▶ INICIAR', + bg='lime green', + fg='white', + font=('Arial', 10, 'bold'), + width=10, + command=self.iniciar_juego + ) + self.btn_iniciar.grid(row=0, column=0, padx=5, pady=5) + + self.btn_pausar = Button( + self.frame_controles, + text='⏸ PAUSAR', + bg='yellow', + fg='black', + font=('Arial', 10, 'bold'), + width=10, + command=self.pausar_juego, + state='disabled' + ) + self.btn_pausar.grid(row=0, column=1, padx=5, pady=5) + + self.btn_reset = Button( + self.frame_controles, + text='🔄 RESET', + bg='orange', + fg='white', + font=('Arial', 10, 'bold'), + width=10, + command=self.resetear_juego + ) + self.btn_reset.grid(row=0, column=2, padx=5, pady=5) + + self.btn_salir = Button( + self.frame_controles, + text='✖ SALIR', + bg='red', + fg='white', + font=('Arial', 10, 'bold'), + width=10, + command=self.salir + ) + self.btn_salir.grid(row=0, column=3, padx=5, pady=5) + + # Label de puntuación + self.lbl_puntuacion = Label( + self.frame_controles, + text='Puntuación 🍎: 1', + bg='black', + fg='lime green', + font=('Arial', 12, 'bold') + ) + self.lbl_puntuacion.grid(row=1, column=0, columnspan=4, pady=5) + + # Canvas del juego + self.canvas = Canvas(self.frame_juego, bg='black', width=479, height=479) + self.canvas.pack() + + # Vincular teclas + self.ventana.bind("", lambda e: self.cambiar_direccion('up')) + self.ventana.bind("", lambda e: self.cambiar_direccion('down')) + self.ventana.bind("", lambda e: self.cambiar_direccion('left')) + self.ventana.bind("", lambda e: self.cambiar_direccion('right')) + self.ventana.bind("", lambda e: self.pausar_juego()) + + def crear_tablero(self): + """Crea el tablero del juego""" + # Crear cuadrícula + for i in range(0, 480, 30): + for j in range(0, 480, 30): + self.canvas.create_rectangle( + i, j, i+30, j+30, + fill='gray10', + outline='gray20' + ) + + # Crear comida inicial + self.canvas.create_text( + self.posicion_food[0], + self.posicion_food[1], + text='🍎', + fill='red2', + font=('Arial', 18), + tag='food' + ) + + # Crear serpiente inicial + self.canvas.create_text( + *self.posicion_snake[0], + text='▀', + fill='lime green', + font=('Arial', 20), + tag='snake' + ) + + def cambiar_direccion(self, nueva_direccion): + """Cambia la dirección de la serpiente""" + if not self.juego_activo or self.juego_pausado: + return + + direcciones_opuestas = { + 'up': 'down', + 'down': 'up', + 'left': 'right', + 'right': 'left' + } + + if self.direction != direcciones_opuestas.get(nueva_direccion): + self.direction = nueva_direccion + + def calcular_nueva_posicion(self): + """Calcula la nueva posición de la cabeza de la serpiente""" + if self.direction == 'up': + self.y -= 30 + if self.y < 15: + self.y = 465 + elif self.direction == 'down': + self.y += 30 + if self.y > 465: + self.y = 15 + elif self.direction == 'left': + self.x -= 30 + if self.x < 15: + self.x = 465 + elif self.direction == 'right': + self.x += 30 + if self.x > 465: + self.x = 15 + + return (self.x, self.y) + + def mover_serpiente(self): + """Mueve la serpiente""" + if not self.juego_activo or self.juego_pausado: + return + + # Calcular nueva posición + nueva_cabeza = self.calcular_nueva_posicion() + + # Verificar colisión consigo misma + if nueva_cabeza in self.posicion_snake and len(self.posicion_snake) >= 4: + self.game_over() + return + + # Actualizar posición de la serpiente + self.posicion_snake.insert(0, nueva_cabeza) + + # Verificar si comió la manzana + if nueva_cabeza == self.posicion_food: + self.comer_manzana() + else: + self.posicion_snake.pop() + + # Actualizar visualización + self.actualizar_canvas() + + # Verificar victoria + if len(self.posicion_snake) >= 257: + self.victoria() + return + + # Continuar el juego + self.ventana.after(self.velocidad, self.mover_serpiente) + + def comer_manzana(self): + """Lógica cuando la serpiente come una manzana""" + # Reproducir sonido + try: + mixer.music.load("assets/audio_snake.mp3") + mixer.music.play(loops=0) + except: + pass + + # Actualizar puntuación + puntuacion = len(self.posicion_snake) + self.lbl_puntuacion['text'] = f'Puntuación 🍎: {puntuacion}' + + # Generar nueva comida + self.generar_comida() + + def generar_comida(self): + """Genera una nueva posición para la comida""" + while True: + self.posicion_food = ( + random.choice(self.posiciones_validas), + random.choice(self.posiciones_validas) + ) + if self.posicion_food not in self.posicion_snake: + break + + self.canvas.coords(self.canvas.find_withtag("food"), self.posicion_food) + + def actualizar_canvas(self): + """Actualiza la visualización de la serpiente""" + # Eliminar serpiente anterior + self.canvas.delete("snake") + + # Dibujar serpiente nueva + for i, pos in enumerate(self.posicion_snake): + color = 'lime green' if i == 0 else 'green2' + self.canvas.create_text( + *pos, + text='▀', + fill=color, + font=('Arial', 20), + tag='snake' + ) + + def iniciar_juego(self): + """Inicia el juego""" + if not self.juego_activo: + self.juego_activo = True + self.juego_pausado = False + self.direction = 'right' + self.btn_iniciar.config(state='disabled') + self.btn_pausar.config(state='normal') + self.mover_serpiente() + + def pausar_juego(self): + """Pausa o continúa el juego""" + if not self.juego_activo: + return + + self.juego_pausado = not self.juego_pausado + + if self.juego_pausado: + self.btn_pausar.config(text='▶ CONTINUAR', bg='lime green', fg='white') + self.mostrar_pausa() + else: + self.btn_pausar.config(text='⏸ PAUSAR', bg='yellow', fg='black') + self.canvas.delete("pausa") + self.mover_serpiente() + + def mostrar_pausa(self): + """Muestra mensaje de pausa""" + self.canvas.create_text( + 240, 240, + text='PAUSA\n\nPresiona ESPACIO\no clic en CONTINUAR', + fill='yellow', + font=('Arial', 20, 'bold'), + tag='pausa' + ) + + def resetear_juego(self): + """Reinicia el juego""" + # Detener juego actual + self.juego_activo = False + self.juego_pausado = False + + # Reiniciar variables + self.x = 15 + self.y = 15 + self.direction = '' + self.posicion_snake = [(75, 75)] + self.posicion_food = (15, 15) + + # Limpiar canvas + self.canvas.delete(ALL) + + # Recrear tablero + self.crear_tablero() + + # Reiniciar puntuación + self.lbl_puntuacion['text'] = 'Puntuación 🍎: 1' + + # Habilitar botón iniciar + self.btn_iniciar.config(state='normal') + self.btn_pausar.config(state='disabled', text='⏸ PAUSAR', bg='yellow', fg='black') + + def game_over(self): + """Muestra pantalla de game over""" + self.juego_activo = False + self.canvas.delete(ALL) + self.canvas.create_text( + 240, 240, + text=f'GAME OVER\n\nPuntuación Final: {len(self.posicion_snake)}\n\n🍎\n\nPresiona RESET\npara jugar de nuevo', + fill='red', + font=('Arial', 20, 'bold') + ) + self.btn_iniciar.config(state='disabled') + self.btn_pausar.config(state='disabled') + + def victoria(self): + """Muestra pantalla de victoria""" + self.juego_activo = False + self.canvas.delete(ALL) + self.canvas.create_text( + 240, 240, + text='¡EXCELENTE!\n\n°° VICTORIA °°\n\n🍎🍎🍎\n\n¡Completaste el juego!', + fill='lime green', + font=('Arial', 25, 'bold') + ) + self.btn_iniciar.config(state='disabled') + self.btn_pausar.config(state='disabled') + + def salir(self): + """Cierra el juego""" + self.ventana.destroy() + self.ventana.quit() + + +# Ejecutar el juego +if __name__ == "__main__": + ventana = Tk() + juego = SnakeGame(ventana) + ventana.mainloop() \ No newline at end of file diff --git a/Tkinter y Matplotlib Grafica Seno - Slider/grafica_matplotlib_scale.py b/Tkinter y Matplotlib Grafica Seno - Slider/grafica_matplotlib_scale.py index 55f8144..e87187e 100644 --- a/Tkinter y Matplotlib Grafica Seno - Slider/grafica_matplotlib_scale.py +++ b/Tkinter y Matplotlib Grafica Seno - Slider/grafica_matplotlib_scale.py @@ -7,7 +7,6 @@ import numpy as np import matplotlib.pyplot as plt - fig, ax = plt.subplots(dpi=90, figsize=(7,5),facecolor='#00faafb7') plt.title("Grafica en Tkinter con Matplotlib",color='red',size=16, family="Arial") @@ -18,29 +17,22 @@ ax.axhline(linewidth=2, color='r') ax.axvline(linewidth=2, color='r') - ax.set_xlabel("Eje Horizontal", color='black') ax.set_ylabel("Eje Vertical", color='black') ax.tick_params(direction='out', length=6, width=2, colors='black', grid_color='r', grid_alpha=0.5) - def graficar_datos(): nivel = scale.get() x = np.arange(-np.pi, 4*np.pi, 0.01) - line, = ax.plot(x, nivel*np.sin(x), color ='b', linestyle='solid') canvas.draw() - label.config(text= nivel) - line.set_ydata(np.sin(x)+10) - ventana.after(100, graficar_datos) - ventana = Tk() ventana.geometry('642x498') ventana.wm_title('Grafica Matplotlib con Scale') @@ -61,6 +53,5 @@ def graficar_datos(): style = ttk.Style() style.configure("Horizontal.TScale", background= 'gray22') - ventana.mainloop()