1 00:00:00,000 --> 00:00:25,400 Bueno, en este último vídeo vamos a ver cómo representar la información que pedíamos 2 00:00:25,400 --> 00:00:34,480 en el examen en el frame principal, o sea, teníamos hasta donde hemos llegado en el 3 00:00:34,480 --> 00:00:39,920 tercer vídeo, esta sería nuestra aplicación y teníamos estos botones que ahora mismo 4 00:00:39,920 --> 00:00:45,180 no hacen nada, tenemos esta de información que tampoco hace nada, o sea, teníamos hecha 5 00:00:45,180 --> 00:00:52,680 nuestra ventana principal con los cuatro frames, en este caso la parte superior, la parte inferior, 6 00:00:52,680 --> 00:00:58,320 la parte de la izquierda, este sería nuestro frame principal que es donde vamos a ir generando 7 00:00:58,320 --> 00:01:04,480 toda la información, generando, mostrando toda la información, cuando pulsábamos mi 8 00:01:04,480 --> 00:01:12,680 información lo que nos salía era una ventana que dependía del tk tk principal, o sea, de esta 9 00:01:12,680 --> 00:01:22,200 ventana, eso quiere decir que si yo cierro esta ventana, esa ventana que depende, esa 10 00:01:22,200 --> 00:01:28,920 ventana hijo, también se cerraría, pero si cierro la ventana hijo, pues la ventana principal, pues se 11 00:01:28,920 --> 00:01:38,880 quedaría abierta, vale, si te fijas, o os fijáis, lo que he hecho antes de empezar a grabar el vídeo 12 00:01:38,880 --> 00:01:44,680 ha sido generar esos dos ficheros json, que son los que tenéis en el aula virtual, que tienen 13 00:01:44,680 --> 00:01:55,920 los datos y las notas, vale, tienen datos de alumnos y sus notas, vale, y a partir de aquí 14 00:01:55,920 --> 00:02:07,240 continuamos, entonces, ¿qué es lo primero que voy a hacer? voy a crearme un pay, vale, que le voy a 15 00:02:07,240 --> 00:02:18,560 llamar, pues por ejemplo, vamos a hacerlo primero, la ventana hijo, que vamos a mostrar cuando pulsamos 16 00:02:18,560 --> 00:02:26,320 en el botón de abajo de mi información, no sé cómo le he puesto, vale, entonces me voy a crear aquí un pay, un 17 00:02:26,320 --> 00:02:36,840 fichero de python, que le voy a llamar mi información, punto pay, vale, entonces con este fichero lo que 18 00:02:36,840 --> 00:02:48,440 voy a crearme es esa clase que me va a mostrar ese fichero de información, como es algo similar, 19 00:02:48,440 --> 00:02:54,600 no, es algo muy parecido a la clase ventana principal, recordar que a clase ventana principal 20 00:02:54,600 --> 00:03:04,080 le llamamos desde el main, desde el principal, esto era una clase que heredaba del tk.tk, vale, 21 00:03:04,080 --> 00:03:11,600 pues en este caso, en vez de heredar del tk.tk, lo que va a hacer es heredar del tk.toplevel, 22 00:03:11,600 --> 00:03:20,400 todas las ventanas que son hijas de alguna, se crean con el toplevel, vale, entonces vamos a ello, 23 00:03:21,800 --> 00:03:32,680 le vamos a poner, para importar, pues como siempre, no, el import tkinter, tkinter as tk, vale, 24 00:03:32,680 --> 00:03:47,280 esto yo lo pongo siempre así, bueno, pues ya está, en herramientas, en herramientas, tenemos dos clases, 25 00:03:47,280 --> 00:03:59,160 una que es mi texto, tenemos otra que es colores aplicación, vale, pues vamos a traernos, vamos a 26 00:03:59,160 --> 00:04:14,440 importar el colores aplicación, entonces vamos a poner, from, punto, herramientas, import, colores, 27 00:04:14,440 --> 00:04:36,440 como hemos dicho, colores, aplicación, vale, import, colores, aplicación, ahí está, vale, pues porque tenemos que seguir una cierta coherencia entre las ventanas, 28 00:04:36,440 --> 00:04:55,440 que es uno de los principios de la programación, vale, nosotros nos creamos la clase que le vamos a llamar, myInformation, por ejemplo, vale, como vosotros queráis, 29 00:04:55,440 --> 00:05:04,440 tk, punto, y esto es la diferencia, aquí no voy con tk, entonces haría otra ventana principal, aquí lo que voy es con el toplevel, vale, 30 00:05:04,440 --> 00:05:23,440 estoy heredando de toplevel, vale, y como hemos visto ya en los otros vídeos, tenemos un constructor, que era, el def, guión bajo, guión bajo, init, guión bajo, guión bajo, self, vale, 31 00:05:23,440 --> 00:05:37,440 y os tenéis que acordar que si a estas clases le pasamos parámetros de entrada, cuando las llamamos desde otros ficheros, es en el init, donde vamos a recibirlos y con los que vamos a trabajar, 32 00:05:37,440 --> 00:05:56,440 vale, yo tengo el init, como es una clase que está heredando del toplevel, os tenéis que acordar de poner también el init, el constructor de esa clase de la que heredáis, 33 00:05:56,440 --> 00:06:10,440 vale, os tenéis que acordar de eso, vale, y entonces, pues para empezar, vamos a declararnos un self, colores, vale, recordar, o en este caso recuerda Lucas, 34 00:06:10,440 --> 00:06:28,440 que para trabajar dentro de las clases, con las diferentes variables, en Unity, lo más fácil que tenéis es poner siempre el self, que es lo que en Java conocéis como el dis, 35 00:06:28,440 --> 00:06:47,440 vale, y de esa manera puedo hacer referencia a esa variable desde cualquier punto de la clase, vale, entonces yo le voy a decir que esto va a ser igual a colores, aplicación, que para eso nos la hemos importado, 36 00:06:48,440 --> 00:07:10,440 vale, entonces aquí le voy a decir, el self, vamos a ponerle un título, a esa ventana que va a aparecer nuestra información, entonces le digo pues, información alumna, por ejemplo, el título que sea, 37 00:07:10,440 --> 00:07:28,440 vale, eso es un string, no tiene más historia, self.geometry, para la geometría, o sea, le voy a dar un alto, un ancho, y le voy a meter también una posición, 38 00:07:28,440 --> 00:07:42,440 entonces fíjate, en esta ayuda que me aparece aquí, vale, en este tooltip, como me pone el width por ahí, ancho por alto, más el x y el y, vale, el width y el x siempre va con una x, 39 00:07:42,440 --> 00:07:58,440 el width y el x es la geometría de la ventana, x y y, pues la posición en x y en y, entonces, eso es un string, pues le pasamos un string y le digo el width, pues vamos a ponerle, por ejemplo, 300, vale, 40 00:07:58,440 --> 00:08:12,440 esto es a ojímetro, lo estoy haciendo a ojímetro, bueno, también depende de la resolución, esto se puede hacer mejor, pero ahora mismo para hacer el vídeo y no hacerlo muy largo, lo voy a dejar así, 41 00:08:12,440 --> 00:08:31,440 ¿qué le estoy diciendo?, que sea 300 de ancho, 1200 de alto, que puede ser como demasiado, ahora lo veo, y en la posición 00, relativa al padre, vale, recuerda que esto es una ventana hijo, 42 00:08:31,440 --> 00:08:52,440 entonces estas posiciones son relativas siempre al padre, ¿qué más le podemos poner?, pues el self, por ejemplo, el self.config, por ejemplo, y en el config le podemos pasar esos colores de fondo para que sea igual a la, 43 00:08:53,440 --> 00:09:09,440 la apariencia que sea igual a la ventana padre, vale, entonces, background, el background, igual, ya que le vamos a decir el self.color, o colores, como le hemos dicho, colores, .get, va, aquí estás, 44 00:09:09,440 --> 00:09:33,440 vale, esto no me acordaba, era color principal, vale, para que coja el mismo color que teníamos, te lo diré, en la ventana principal, a lo mejor, más que coger el color principal, 45 00:09:34,440 --> 00:09:51,440 lo que podemos hacer es coger el color del encabezado del pie, que son más oscuros, para que resalte más, vale, que esto ya es una cosa que, bueno, pues un poco, tema del diseñador, vale, pues si yo aquí le pongo, 46 00:09:51,440 --> 00:10:18,440 yo creo que quedará mejor, paréntesis, paréntesis, vale, y pues ya está, ahora vamos a empezar a meter los widgets, vale, para meter, para meter la información del alumno, 47 00:10:18,440 --> 00:10:28,440 que era lo que os pedía en el examen, vale, entonces, para hacer eso voy a crear otro frame, no lo voy a hacer directamente sobre la ventana, que podrías, eh, pero ya que estamos trabajando con frame, 48 00:10:28,440 --> 00:10:40,440 pues vamos a crearnos otro frame, entonces aquí, vamos a crear un frame, exactamente igual que hemos hecho en la ventana principal, vale, parece que en la ventana principal, a lo mejor, 49 00:10:40,440 --> 00:10:54,440 puedes pensar que tenía más sentido, porque hemos troceado esa ventana con la parte superior, izquierda, inferior, la principal, vale, aquí lo que voy a hacer es agruparlo todo en un frame, 50 00:10:54,440 --> 00:11:07,440 porque a la hora de trabajar, en realidad, es más cómodo, vale, y a la hora de hacer cambios es mucho más cómodo, entonces, voy a crear ese frame, entonces le vamos a poner self.frame, 51 00:11:07,440 --> 00:11:24,440 frame, por ejemplo, va a ser igual a tk, vale, que para eso, nos lo hemos creado, bueno, en este caso, yo creo que no me hace ni falta, vamos a ponerle el ctkframe, 52 00:11:24,440 --> 00:11:47,440 a ver, para usar el ctkframe, se me ha olvidado, aquí, poner el import, y vamos a poner el custom tkinter, y aquí sí que ctk, 53 00:11:47,440 --> 00:12:16,440 y aquí sí, ctkinter, ctkframe, aquí estás, 54 00:12:16,440 --> 00:12:32,440 ctkframe, vale, y como siempre, a pasarle parámetros, cuál es el primer parámetro, donde quieres dibujar ese, donde quieres, sí, dibujar este frame, vale, donde quieres que te aparezca, 55 00:12:32,440 --> 00:12:48,440 en qué ventana, en este caso, en qué ventana es, en la que estamos construyendo nuestra clase, así que es ella misma, self, vale, ahí hace referencia a ella misma, vale, un color de, un fgcolor, 56 00:12:48,440 --> 00:13:11,440 un color de primer plano, pues vamos a ponerle, colores, ahí no, perdón, self.colores, vale, ahora vamos a poner, pues, el get, y le voy a volver a poner el color de la cabecera, 57 00:13:11,440 --> 00:13:30,440 que esto, ya te digo, que luego lo podemos ir cambiando, podría coger cualquiera de los colores que he ido creando en el pi de herramientas, vale, el fichero de python de herramientas, entonces le pongo, get cabecera, paréntesis, paréntesis, 58 00:13:30,440 --> 00:13:51,440 si sigo pasando parámetros, pues le pongo un bordercolor, por ejemplo, bordercolor va a ser igual, pues lo mismo, self.colores, punto, sí, punto, get, y en este caso le vamos a pasar, pues qué color le podemos pasar, 59 00:13:51,440 --> 00:14:16,440 podemos pasar el de la izquierda, a lo mejor, yo que sé, no sé, ahora lo vemos como va quedando, vale, le decimos que nos lo dibuje ese frame que tenga, en vez de ser ángulos rectos las esquinas del frame, pues que sean un poco conchafladas, 60 00:14:17,440 --> 00:14:40,440 redondeadas, entonces le ponemos, pues por ejemplo, el, cómo era, corner, este, corner radius, vamos a poner esto que se vea bien, ajuste de parámetros, vale, y el corner radius, pues le vamos a decir, pues, a 12, vale, 61 00:14:41,440 --> 00:15:08,440 qué más le podemos decir, el color de fondo, que le hemos dicho solo el de primer plano, cuál va a ser el color de fondo, pues le vamos a poner el mismo, self, el mismo que tenías, self, punto, colores, punto, getcolor, fuente, 62 00:15:09,440 --> 00:15:30,440 vamos a poner este, ya te digo que esto al tenerlo en los diferentes ficheros de python, luego es muy fácil cambiarlo, vale, y yo creo que con esto para hacer el frame me vale, así que pues por ahora lo dejo ahí, vale, 63 00:15:31,440 --> 00:15:47,440 ahora vemos cómo nos queda, vale, que es lo siguiente que teníamos que hacer cuando metemos un widget, decirle en qué posición queremos que se coloque dentro del contenedor, que en este caso es la ventana del tcat top level, vale, 64 00:15:47,440 --> 00:16:10,440 entonces aquí le digo el self.frame.grid, y le voy a decir en qué posición, pues siempre acuérdate de relativo al padre, es el column igual a cero, el row igual a cero, vale, o sea, la esquina superior izquierda, 65 00:16:11,440 --> 00:16:34,440 y que tenga un pad i igual a veinte, que no se pegue a lo que es el margen de la ventana del top level, que deje siempre ahí un espacio, pues porque quedará mejor, vale, ya me están llamando, vale, un momentito, 66 00:16:34,440 --> 00:16:58,440 vale, continuamos, entonces lo del pad x para meter ese margen, vale, vale, ya tendríamos situado nuestro frame dentro de nuestro top level, eso es, vale, 67 00:16:58,440 --> 00:17:19,440 podemos decirle también, o podemos pasarle cuantas columnas va a tener este frame, vale, acuérdate, que le podríamos configurar el número de filas y el número de columnas, vale, 68 00:17:19,440 --> 00:17:40,440 entonces podemos poner el self.frame.columnconfigure, y aquí le voy a decir, a ver, cuantas columnas va a tener, en principio una, vale, le decimos una, vale, que es la cero, 69 00:17:41,440 --> 00:17:58,440 y le voy a decir que el weight, que es el peso que van a tener esas columnas a la hora de meter widget, vale, que una mande sobre otra, le digo cada uno, esto no es obligatorio ponerlo, pero si se recomienda siempre, vale, 70 00:17:58,440 --> 00:18:21,440 le pongo el self.frame.rowconfigure, cuantas filas va a tener, bueno, pues en este caso, le voy a meter tres por si acaso, no me acuerdo, os pedía el nombre, el ciclo, no sé, ahora lo miro, vale, 71 00:18:21,440 --> 00:18:42,440 entonces le voy a pasar cero, uno, y dos, tres, y que le paso también al weight, y que le paso también a uno, vale, ese peso entre las filas, vale, y ahora ya si me pongo a ir dibujando, ir cargando los widget en ese frame, 72 00:18:42,440 --> 00:19:11,440 entonces aquí le voy a pasar self.lbl, y le llamo información, vale, por ejemplo, información, esto que va a ser un ctk label, ¿dónde lo voy a dibujar?, en frame, en self, 73 00:19:12,440 --> 00:19:33,440 frame, vale, es ahí en el frame que acabamos de crear en esta parte de arriba, aquí vamos a ponerle cargando widget, vale, entonces le voy a dibujar en el frame, vale, el contenedor de esos widget va a ser ese frame, 74 00:19:33,440 --> 00:20:02,440 el texto que quiero que aparezca, pues va a ser alumno, pues lucas, vale, por ejemplo, le podemos meter la fuente, el font, vale, entonces la fuente, pues alguna que tenga yo cargada en el sistema, osaria, que esa está siempre, le puedo pasar también con la fuente el tamaño, pues veinte, vale, 75 00:20:04,440 --> 00:20:29,440 le podemos pasar el color del texto, testcolor, y le voy a pasar un stream, pues por ejemplo en white, en blanco, vale, y con esto, pues me vale, ¿qué más le tengo que poner ahora a esta etiqueta?, 76 00:20:30,440 --> 00:20:53,440 vamos a pasarle también el parámetro del width, vale, que nos puede venir bien, el ancho que va a tener ese texto, vale, ¿qué más tiene que tener la etiqueta?, el information, punto, la posición, acordaros siempre de que hay que meter ese grid, 77 00:20:53,440 --> 00:21:13,440 vale, o ese pack, o ese place, vale, en este caso le voy a decir que vamos a estar en la parte de arriba, el column cero, el row cero, vale, y que me lo ponga centrado, 78 00:21:13,440 --> 00:21:40,440 aquí le pasamos nwes, son todos los puntos jardinales, entonces va a coger y me lo va a poner centrado, así mismo, vale, esa va a ser mi primera etiqueta, vale, y seguimos metiendo más etiquetas, 79 00:21:41,440 --> 00:22:04,440 vamos a meter ahora, pues otra etiqueta, vale, vamos a meter otra etiqueta que para eso, vamos a coger, como le hemos dicho tres columnas, pues esto es por juguetear, 80 00:22:05,440 --> 00:22:32,440 le voy a decir, esto no se que me he hecho, nada, bueno, pues, no se, información dos, o información uno, lo voy a dibujar otra vez en frame, vale, aquí hago un copiar y pegar, 81 00:22:32,440 --> 00:22:59,440 porque al final, pues es todo el tiempo exactamente lo mismo, aquí que le voy a poner, pues el centro, centro, y es Villablanca, vale, le dejo el tamaño, le dejo todo igual, 82 00:23:00,440 --> 00:23:16,440 todo igual, en este caso, aquí ya no me hace falta el width, porque ya me lo he ajustado con la primera etiqueta, vale, le digo también que me lo deje centrado, en este caso le digo la columna cero, 83 00:23:16,440 --> 00:23:32,440 pero la fila uno, porque si no me lo va a dibujar todo en el mismo sitio, vamos a meter esa tercera fila que hemos configurado en el row config, y entonces aquí le vamos a poner la dos, vale, 84 00:23:32,440 --> 00:23:45,440 esto está mal, aquí hay que poner un uno, aquí hay que poner un dos, vale, volvemos a dibujar en el frame, aquí le vamos a poner un texto, pues que sea el módulo, 85 00:23:46,440 --> 00:24:12,440 entonces le ponemos el módulo, módulo, dos puntos, y le ponemos, vamos a ponerle que son 500 sistemas de gestión empresarial, todo igual, otra vez, le vuelvo a quitar este 500, 86 00:24:12,440 --> 00:24:27,440 pues no me dice ahora mismo ya nada, pero no me dice nada, porque ya lo he puesto en la primera etiqueta, vale, que eso es importante, al ponerlo en la primera etiqueta ya le estoy dando ese tamaño a esas columnas, 87 00:24:27,440 --> 00:24:47,440 a esa primera columna, ya le estoy diciendo que todas van a tener ese tamaño de 500, vale, en este caso va a ser aquí en la dos, vale, y en principio ya lo tendríamos, ya tendríamos hecha nuestra clase, 88 00:24:47,440 --> 00:25:06,440 ahora lo probamos, con el tk top level, y configuramos lo que va a ser esa ventana, vale, y la tenemos en miinformacion.py, vale, y entonces que tendremos que hacer ahora, pues lo primero, cargar ese miinformación, vale, 89 00:25:06,440 --> 00:25:35,440 la hemos llamado myinformation la clase, el fichero es mi información, vale, entonces nos vamos a venir a clase ventana principal, aquí vamos a importar, from, miinformación, import, myinformation, vale, ya tengo acceso a esa clase, vale, genial, 90 00:25:35,440 --> 00:26:02,440 y ahora lo que tengo que hacer es asociar a ese botón que, lo diré, que llama a, que llama a la información general, vamos, la información del usuario, pues crear una función, 91 00:26:02,440 --> 00:26:31,440 y que desde ese botón, llame a esa función, vale, entonces para hacer eso, teníamos, vamos a ver aquí, los botones, migración de datos, vale, y tienes el load json, teníamos botón opción dos, mi información, vale, esto es lo que buscaba, 92 00:26:32,440 --> 00:27:01,440 este, ajuste de palabra, command, y poníamos, save my information, vale, pues en save my information, vamos a irnos a esa función, y a crear los pasos necesarios, para cargar esa clase, con esa ventana, vale, 93 00:27:01,440 --> 00:27:22,440 entonces, ¿qué es lo que tengo que hacer?, pues crearme, yo por defecto siempre pongo el self, aquí no me haría falta, pero bueno, yo le pongo, vale, le llamo mi información, una variable, ¿a qué va a ser igual esta variable?, vale, mi información, o como tú quieras, como vosotros queráis, vale, ¿a qué va a ser igual? 94 00:27:22,440 --> 00:27:47,440 Lo que tengo que hacer ahí, es instanciar, esa clase, que acabo de cargar, que es, my information, vale, ya la tengo instanciada, he hecho una instancia de la clase que tengo guardada dentro del fichero de python, de mi información, la que acabamos de crear, vale, esto, me da un error aquí, el self, ¿por qué?, porque he puesto el nombre de la función, 95 00:27:47,440 --> 00:28:16,440 pero hay que acordarse de meter entre los paréntesis siempre el self, vale, bueno, ya tenemos esa instancia, perfecto, pues ahora, ¿qué es lo que le voy a decir?, pues recordar que cuando yo visualizo una, cuando creo una ventana con el tk.tk, o una ventana con el top level, vale, una ventana hijo, me da igual las dos, 96 00:28:17,440 --> 00:28:35,440 hay que acordarse de que siempre le pasamos el main loop, vale, para que me esté redibujando todo el tiempo esa ventana, vale, nosotros en los widgets podemos hacer cambios, podemos hacer widgets, generarlos dinámicamente, etc. 97 00:28:35,440 --> 00:29:04,440 vale, entonces es importante el meter el main loop, el main loop ahora mismo, ¿sobre qué iría?, sobre mi información, esta variable que he creado aquí arriba, punto main loop, vale, y paréntesis, paréntesis, bueno, en principio ya lo tenemos todo, vamos a probarlo, tenemos, vamos a nuestro fichero, a nuestro main, vale, a nuestro principal, 98 00:29:05,440 --> 00:29:27,440 play, vale, y aquí nos está diciendo, con nuestra aplicación, a ver qué error nos está dando, ventana principal, mi información, 99 00:29:36,440 --> 00:30:01,440 que no reconoce el parent package, vamos a ver, mi información, este punto aquí no sé qué pinta, listo, venga, a ver si ahora sí, vale, tenemos nuestra ventana, nuestra aplicación, 100 00:30:02,440 --> 00:30:21,440 mi migración de datos, pues no hace nada, vale, y mi información, cuando lo pulso, vale, pues me ha salido así, mal, feo, vale, feo, lo he puesto al revés en los tamaños, venga, pues vamos a cambiarlo, vale, entonces vamos a coger, 101 00:30:22,440 --> 00:30:45,440 vamos a ir a mi información, me voy a venir aquí, vale, que esto era lo que es una barbaridad poner el 300, entonces, como 300 puede estar bien, y aquí le voy a dejar 200, vale, y aquí vamos a poner, pues en la posición, 102 00:30:46,440 --> 00:31:08,440 200 y 400, para que me lo mueva, vale, venga, pues lo vuelvo a probar, vale, esto aquí, esto aquí, vale, necesito, ahora de alto está bien, lo puedo poner un poco más pequeño, vale, o venga, 103 00:31:09,440 --> 00:31:34,440 mi información, vamos a ponerle de ancho, pues 500, de alto me vale con 150, venga, bueno, pero ya veis que ya es cuestión de que me quede bien, vale, entonces mi información aquí está, perfecto, vale, 104 00:31:35,440 --> 00:31:51,440 entonces, me está haciendo, ves que me lo está poniendo aquí, no me lo está cogiendo en relación con el padre, vale, me sorprende, pero eso a través de código podemos decir que siempre todas las ventanas estén centradas, 105 00:31:51,440 --> 00:32:12,440 vale, pero con el string en el que yo le paso estas posiciones, pues no me lo está cogiendo, vale, entonces, bueno, pues tampoco pasa nada, pero ya os digo que se puede hacer, vale, 106 00:32:12,440 --> 00:32:31,440 ya os dije como coger con el info, el winfo, la resolución y entonces ir centrándolo todo, vale, y se puede hacer sin problema, esta es la ventana hijo, así que si yo cierro esta ventana, no hay problema, vale, 107 00:32:31,440 --> 00:33:00,440 no se cierra la aplicación, si yo la vuelvo a sacar, la tengo aquí y cierro la ventana, bueno, cierro la ventana padre, vamos a ver, si yo ahora cierro la ventana padre, venga, se me van a cerrar todas las ventanas hijo, vale, 108 00:33:01,440 --> 00:33:19,440 que es un poco lo del top level y el tk que os estaba diciendo, vale, entonces esto es para la ventana de información, bueno, que más hemos hecho, pues antes de empezar, lo que os decía antes, vale, he creado estos ficheros json, 109 00:33:19,440 --> 00:33:36,440 y estos ficheros son los que tenemos que leer y mostrar, en el frame principal, vale, entonces, ahí vamos a crearnos una función que la voy a llamar, pues el load json, vale, 110 00:33:36,440 --> 00:33:56,440 entonces, con el load json, con esa clase, voy a empezar a cargar los datos y a mostrarlos, vale, entonces para hacer esto, 111 00:34:06,440 --> 00:34:26,440 pues como lo hago yo esto, vamos a crear un fichero, le voy a llamar load json, vale, 112 00:34:26,440 --> 00:34:47,440 load json.py, vale, es otro pi para crear otra clase, vale, en esta clase voy a empezar a crear lo de siempre, vale, 113 00:34:47,440 --> 00:35:12,440 el import tkinter as tk, from tkinter import, este disco, vale, lo que nos pueda hacer falta, from herramientas, 114 00:35:12,440 --> 00:35:30,440 vamos a importar los colores, vale, colores aplicación, vamos a abrir mi texto, vale, que también la teníamos, desde, 115 00:35:43,440 --> 00:36:02,440 lo vamos a importar todo ya que lo tenemos, pues si nos hace falta más que nada, información import, my information, from custom tkinter import, 116 00:36:02,440 --> 00:36:18,440 este disco también, vale, acordaros de que el tkinter y el custom tkinter, el custom tkinter es más nuevo y permite hacer ahí cosillas con una interfaz más actual, vale, 117 00:36:18,440 --> 00:36:39,440 importamos el json y el os, porque el os y el json para poder leer y guardar esos datos en un fichero, en lo que nos haga falta, vale, y el json para leer esos json, vale, 118 00:36:39,440 --> 00:36:50,440 el os para el sistema operativo, para operaciones sobre sistemas operativos, vale, y como también vamos a trabajar con la base de datos, pues entonces, 119 00:36:51,440 --> 00:37:10,440 pero eso no lo tenemos hecho, vale, entonces, antes de hacer esto, esta clase, vamos a crearnos otra clase que le vamos a llamar, 120 00:37:10,440 --> 00:37:34,440 base de datos, base de datos.py, vale, pues base de datos, en base de datos vamos a importar para conectarnos a nuestro MySQL, vale, que era de lo que se trataba el ejercicio, 121 00:37:35,440 --> 00:37:54,440 vamos a crearnos una base de datos, vale, entonces me voy a crear una clase que le voy a llamar mi base de datos, ahí va, que no hereda de nada, que vamos a meter el init, 122 00:37:54,440 --> 00:38:11,440 el constructor, como siempre con el self, y en este caso le voy a pasar los datos del primer json y los datos del segundo json, y ya hago la mezcla, ya los uno, 123 00:38:11,440 --> 00:38:27,440 a partir de aquí o del otro código, vale, ahora lo vamos viendo, vale, ese es el definit, que es lo que hago aquí, pues para poder trabajar de diferentes funciones, 124 00:38:27,440 --> 00:38:51,440 le meto el self a datos1, le meto el self a datos2, para poder trabajar desde cualquier parte del script, perdón, de la clase, vale, que más le digo, 125 00:38:51,440 --> 00:39:10,440 pues vamos a hacer esa conexión con la base de datos, entonces le digo el self.conexion es igual a mysql.connector.connect, recordar que estamos con docker o si tenéis la base de datos en casa 126 00:39:10,440 --> 00:39:23,440 o lo que sea, vale, pero si estáis con docker hay que arrancar primero el docker y cargar esa imagen del mysql, vale, que tres parámetros hay que pasarle a la conexión, 127 00:39:23,440 --> 00:39:42,440 el host con el localhost, hay que pasarle el localhost porque lo tenemos en local, el user que va a ser un string que va a ser el usuario, que por defecto va a ser root, 128 00:39:42,440 --> 00:40:05,440 vale, el password que recordar que cuando arrancábamos desde el docker y arrancábamos esa imagen le decíamos esa password 123456, por ejemplo, la que vosotros le hayáis dado, y con esto nos debe hacer la conexión a la base de datos, vale, 129 00:40:06,440 --> 00:40:25,440 luego creamos una variable que era la de cursor, que es la que me va a permitir realizar las distintas consultas sobre la base de datos, vale, las consultas que son consultas, pues eso, las de siempre, 130 00:40:25,440 --> 00:40:50,440 las de selección, inserción de registros, eliminación, vale, todas las que habéis visto en primero, entonces el cursor se declara, esa variable self.cursor es self.conexion.cursor, vale, 131 00:40:50,440 --> 00:41:12,440 a partir de ahora yo ya puedo empezar a crear mis consultas, ¿qué es lo que voy a hacer?, pues primero voy a llamar a una función self.crearBaseDatos, por ejemplo, vale, 132 00:41:12,440 --> 00:41:37,440 así que aquí vamos a poner dev.crearBaseDatos.self.pass, vale, para que ahora no me dé ningún problema, luego ¿qué más puedo hacer?, crear las tablas, self.crearTabla, 133 00:41:37,440 --> 00:42:04,440 así que vamos a crearnos otra función que va a ser dev.crearTabla, vale, con el self, los dos puntos, pass, vamos a crearnos otra función que va a ser self.guardarDatos, 134 00:42:04,440 --> 00:42:26,440 vale, y lo mismo, dev.guardarDatos.self, vale, bueno, en principio es esto, ¿qué es lo que voy a hacer en crear base de datos?, crear esa base de datos, 135 00:42:26,440 --> 00:42:45,440 como es una operación sobre base de datos, lo suyo es jugar con el try catch, vale, intenta, self.cursor, la variable que me he creado aquí arriba y que es la que os digo que es necesaria para meter una función, 136 00:42:45,440 --> 00:43:01,440 el punto execute, y ahora le pasamos el string de esa operación, de esa consulta que queremos hacer sobre la base de datos, en este caso ¿cuál es?, createDatabase, si no existe, 137 00:43:01,440 --> 00:43:27,440 si no existe, y le vamos a llamar examen, vale, esto me va a crear, va a lanzar esa consulta y me va a crear la base de datos siempre que se haya conectado bien con estos tres parámetros 138 00:43:27,440 --> 00:43:46,440 que hemos pasado aquí arriba, me va a crear esa base de datos que se llama examenDAM si es que no existe, vale, y pues vamos a meterle el print, creada satisfactoriamente, 139 00:43:46,440 --> 00:44:06,440 por ejemplo, vale, que ocurra una excepción porque no te logueas bien, porque hay algún problema con la contraseña, porque no encuentran MySQL que no está arrancado, ese tipo de cosas, le metemos el string, 140 00:44:07,440 --> 00:44:28,440 y aquí le ponemos print, no creada, por ejemplo, vale, ya tendríamos creada nuestra base de datos, que ahora lo que quiero es crear las tablas exactamente igual, 141 00:44:28,440 --> 00:44:53,440 y al final, le voy a decir self.cursor.execute, aquí estás, que es lo primero que le decimos, useExamenDAM, vale, y le pongo el punto y coma, 142 00:44:53,440 --> 00:45:14,440 que por cierto, en crear la base de datos, yo creo que ya ni siquiera nos hace falta, vale, le decimos que use esa base de datos, ahora una vez que ya estamos situados en esa base de datos, 143 00:45:15,440 --> 00:45:35,440 self.cursor.execute, que es lo que hago ahora, crear esa base, esa tabla, create table, si no existe, me vas a crear la tabla que es datos, por ejemplo, migrados, 144 00:45:35,440 --> 00:45:57,440 datos migrados, vale, datos migrados 2, el nombre, los campos que voy a meter dentro de esa tabla, cuáles son, username, vale, que es de tipo, 145 00:45:57,440 --> 00:46:22,440 varchar40, por ejemplo, 40, le voy a poner un campo que es el email, el email, que es varchar, de un tamaño de 70, 146 00:46:23,440 --> 00:46:48,440 le voy a poner un password, que es varchar, de un tamaño de 40, le vamos a poner nota1, que es varchar, tipo 2, vale, es numérica, es una nota, 147 00:46:48,440 --> 00:47:04,440 pero ya sabéis que si no voy a hacer operaciones con esa nota, lo suyo es guardarlo como texto, porque ocupa menos lo que es el disco, no es lo mismo guardar un carácter que un número, 148 00:47:04,440 --> 00:47:20,440 vale, y eso es importante, la nota 2, que es varchar2, y teníamos una nota 3, o no teníamos una nota 3, no, teníamos dos notas, vale, entonces, eso sería, 149 00:47:20,440 --> 00:47:37,440 ese paréntesis, en el de la consulta, punto y coma, vamos a ver si he puesto bien todos los paréntesis, que puede ser que no, ajuste de palabra, 150 00:47:37,440 --> 00:48:04,440 vale, y le pongo el print, tabla, entre comillas, creada, 151 00:48:04,440 --> 00:48:22,440 satisfactoriamente, vale, y que más hago, como estamos en el tray, pues el step siempre, 152 00:48:22,440 --> 00:48:32,440 vale, print, tabla, no creada, o lo que vosotros queráis, el texto que vosotros queráis, 153 00:48:32,440 --> 00:48:38,440 al final eso es solo el texto que se va a imprimir en la consola, vale, bueno, este vídeo, 154 00:48:38,440 --> 00:48:44,440 para que no se me haga mucho más largo, lo voy a dejar aquí, ya hemos creado la base de datos, 155 00:48:44,440 --> 00:48:50,440 hemos creado la tabla, hemos creado la conexión, pues esto tiene que funcionar, ya veis que 156 00:48:50,440 --> 00:48:56,440 a la hora también de crear esa ventanita, ese top level de información, también tenéis la clase, 157 00:48:56,440 --> 00:49:07,440 vale, y os hago un quinto vídeo ya, con lo que nos faltaría, que sería terminar el fichero este 158 00:49:07,440 --> 00:49:16,440 del load JSON, que va a hacer, por un lado, guardar estos datos, vale, y cargar los datos, 159 00:49:16,440 --> 00:49:24,440 a ver, cargar los datos que leemos en el JSON, y mostrarlos en el frame principal, 160 00:49:24,440 --> 00:49:29,440 y luego también guardarlos en la base de datos, que es lo que estoy haciendo ahora, vale, bueno, 161 00:49:29,440 --> 00:49:39,440 pues entonces, os debo ese quinto vídeo, este de guardar, hay que ponerlo con el pas, 162 00:49:39,440 --> 00:49:44,440 si no nos da error, vale, bueno, un saludo chicos, hasta luego.