├── .gitignore ├── .vscode └── settings.json ├── README.md ├── etc ├── demo.py └── demo_idle.py ├── parte04 ├── 4.1_primer_programa.py ├── 4.2_primer_programa.py ├── 4.3_variables.py ├── 4.4_variables_cadenas_caracteres.py ├── 4.5_ejercicios.txt ├── ex4.1_version_python.py ├── ex4.2_fecha_hora_actuales.py ├── ex4.3_area_circulo.py ├── ex4.4_invertir_nombre.py └── ex4.5_area_triangulo.py ├── parte05 ├── 5.01_enteros_int.py ├── 5.02_reales_float.py ├── 5.03_complejos_complex.py ├── 5.04_booleanos_bool.py ├── 5.05_cadena_caracteres_string.py ├── 5.06_tuplas_tuple.py ├── 5.07_lista_list.py ├── 5.08_diccionario_dict.py ├── 5.09_conjunto_set.py ├── 5.10_Ejercicios.txt ├── ex5.01_conversion_lista_a_tupla.py ├── ex5.02_invertir_tupla.py ├── ex5.03_seccion_tupla.py ├── ex5.04_remover_elemento_tupla.py ├── ex5.05_remover_duplicados_lista.py ├── ex5.06_palabras_longitud_mayor_o_igual_5.py ├── ex5.07_elemento_aleatorio_lista.py ├── ex5.08_frecuencia_elementos_lista.py ├── ex5.09_suma_valores_diccionario.py ├── ex5.10_remover_duplicados_diccionario.py ├── ex5.11_top_3_valores_diccionario.py ├── ex5.12_conversion_diccionario_json.py ├── ex5.13_union_interseccion_conjuntos.py ├── ex5.14_diferencia_conjuntos.py └── ex5.15_diferencia_simetrica_conjuntos.py ├── parte06 ├── 6.01_operadores_numericos.py ├── 6.02_operadores_comparacion.py ├── 6.03_operadores_logicos.py ├── 6.04_operadores_nivel_bits.py ├── 6.05_operadores_asignacion.py ├── 6.06_precedencia_operadores.py ├── 6.07_linealizacion_expresiones_algebraicas.py ├── 6.08_ejercicios.txt ├── ex6.1_conversion_grados_radianes.py ├── ex6.2_conversion_radianes_grados.py ├── ex6.3_area_trapezoide.py ├── ex6.4_area_volumen_cilindro.py ├── ex6.5_discriminante_ecuacion_cuadratica.py └── ex6.6_linealizacion_expresiones_algebraicas.py ├── parte07 ├── 7.1_funcion_input.py └── 7.2_funcion_print.py ├── parte08 ├── 8.1_condicionales_intro.py ├── 8.2_numero_mayor.py ├── 8.3_incremento_ahorros.py ├── 8.4_condiciones_multiples.py ├── 8.5_condiciones_multiples_mejora.py ├── 8.6_condiciones_compuestas_operador_logico_or.py ├── 8.7_ejercicios.txt ├── ex8.01_temperatura.py ├── ex8.02_adivinar_numero.py ├── ex8.03_precio_producto_mayor.py ├── ex8.04_recta_punto.py ├── ex8.05_punto_area_rectas.py ├── ex8.06_aplicar_descuento.py ├── ex8.07_categorizar_jugador.py ├── ex8.08_par_impar.py ├── ex8.09_numero_entero_es_capicua.py └── ex8.10_esquema_rgb.py ├── parte09 ├── 9.1_ciclo_for.py ├── 9.2_ciclo_while.py ├── 9.3_ejercicios.txt ├── ex9.01_patron_asteriscos.py ├── ex9.02_invertir_frase.py ├── ex9.03_generar_numeros_fibonacci.py ├── ex9.04_factorial_numero.py ├── ex9.05_patron_letra_A.py ├── ex9.06_pares_rango_100_400.py ├── ex9.07_patron_letra_E.py ├── ex9.08_cantidad_digitos_letras.py ├── ex9.09_patron_letra_Z.py ├── ex9.10_estadisticas_basicas.py └── ex9.11_sumataria_productoria.py ├── parte10 ├── 10.1_excepciones.py ├── 10.2_excepciones_aritmetica.py ├── 10.3_indices_lista.py ├── 10.4_llaves_diccionario_excepcion.py ├── 10.5_error_atributos_clase.py ├── 10.6_archivo_no_existente.py └── 10.7_excepcion_personalizada.py ├── parte11 ├── 11.1_intro_funciones.py ├── 11.2_argumentos_valor_referencia.py ├── 11.3_argumentos_variables.py ├── 11.4_argumentos_nombrados_variables.py ├── 11.5_argumentos_por_defecto.py ├── 11.6_funciones_recursivas.py ├── 11.7_expresiones_lambda.py ├── 11.8_ejercicios.txt ├── ex11.01_funcion_mayor_numeros.py ├── ex11.02_suma_lista_tupla.py ├── ex11.03_producto_lista_tupla.py ├── ex11.04_invertir_cadena_caracteres.py ├── ex11.05_valor_en_rango.py ├── ex11.06_funcion_conteo_minusculas_mayusculas.py ├── ex11.07_numeros_unicos.py ├── ex11.08_suma_recursiva.py ├── ex11.09_funcion_recursiva_palindromo.py └── ex11.10_division_recursiva.py ├── parte12 ├── 12.1_programa_python.py ├── 12.3_uso_programa_python.py ├── demo_122_programa_python_punto_entrada.py └── proyecto │ ├── calculadora │ ├── __init__.py │ ├── __main__.py │ └── funciones_aritmeticas.py │ └── setup.py ├── parte13 ├── proyecto0 │ ├── inventario │ │ ├── __init__.py │ │ ├── __main__.py │ │ └── inventario_funciones.py │ └── setup.py └── proyecto_0_inventario.txt ├── parte14 ├── 14.1_introduccion_manipulacion_archivos.py ├── 14.2_creacion_archivo_texto_plano.py ├── 14.3_adicion_contenido_archivo.py ├── 14.4_intro_archivos_binarios.py ├── 14.5_lectura_archivo_binario.py ├── 14.6_archivos_binarios_with.py ├── 14.7_modulo_pickle.py ├── 14.8_operaciones_adicionales.py ├── 14.9_ejercicio.txt ├── archivo1.txt ├── lenguajes.txt ├── numeros.bin ├── paises.txt ├── paises_capitales.pickle └── proyecto0 │ ├── inventario │ ├── __init__.py │ ├── __main__.py │ ├── inventario.pickle │ └── inventario_funciones.py │ └── setup.py ├── parte15 └── inventario │ ├── __init__.py │ ├── __main__.py │ ├── base_datos │ ├── __init__.py │ └── conexion.py │ ├── gui │ ├── __init__.py │ ├── dialogos.py │ ├── formularios.py │ ├── menus.py │ └── ventana.py │ └── modelos │ ├── __init__.py │ ├── cliente.py │ ├── factura.py │ ├── producto.py │ └── proveedor.py ├── parte16 ├── animales │ ├── main.py │ └── modelos │ │ ├── __init__.py │ │ ├── animal.py │ │ ├── gato.py │ │ ├── pato.py │ │ └── perro.py ├── carros │ ├── main.py │ └── modelos │ │ ├── __init__.py │ │ ├── camion.py │ │ ├── carro.py │ │ ├── deportivo.py │ │ ├── formula1.py │ │ └── volqueta.py ├── ejercicio1.txt ├── empleados │ ├── main.py │ └── modelos │ │ ├── __init__.py │ │ ├── empleado.py │ │ ├── empleado_comision.py │ │ ├── empleado_horas.py │ │ └── empleado_nomina.py ├── figuras │ ├── main.py │ └── modelos │ │ ├── __init__.py │ │ ├── circulo.py │ │ ├── figura.py │ │ ├── rectangulo.py │ │ └── triangulo.py └── proyecto0 │ ├── inventario │ ├── __init__.py │ ├── __main__.py │ ├── inventario.pickle │ ├── inventario_funciones.py │ └── modelos │ │ ├── __init__.py │ │ ├── inventario.py │ │ ├── producto.py │ │ └── venta.py │ └── setup.py ├── parte17 ├── Parte17-Ejercicios.txt ├── ball.jpg ├── circuloIcon.ico ├── datos.db ├── demo01_hola_pyqt5.py ├── demo02_qlabel.py ├── demo03_qpushbutton.py ├── demo04_qmessagebox.py ├── demo05_qlineedit.py ├── demo06_mensaje_saludo.py ├── demo07_calculadora_suma.py ├── demo08_calculadora_suma_qdoublevalidator.py ├── demo09_calculadora_suma_qintvalidator.py ├── demo10_dialog_confirmacion_eliminacion.py ├── demo11_aplicacion_con_barra_menu.py ├── demo12_qinputdialog.py ├── demo13_qradiobutton.py ├── demo14_pizza_qcheckbox.py ├── demo15_imagen.py ├── demo16_seleccionar_color.py ├── demo17_seleccionar_fuente.py ├── demo18_mdi.py ├── demo19_qfiledialog.py ├── demo20_qcombobox.py ├── demo21_qspinbox.py ├── demo22_qslider.py ├── demo23_barra_herramientas.py ├── demo24_portapapeles.py ├── demo25_qcalendarwidget.py ├── demo26_qwidget.py ├── demo27_lista_qlistwidget.py ├── demo28_qtabwidget.py ├── demo29_mostrar_saludo.py ├── demo30_pintar_puntos.py ├── demo31_tabla_datos_qtablewidget.py ├── demo32_colores_lienzo.py ├── demo33_dialogo_captura_datos.py ├── demo34_distribucion_horizontal_componentes.py ├── demo35_qgridlayout.py ├── demo36_qtreeview.py ├── demo37_arrastrar_y_soltar.py ├── demo38_saludo_qt_designer.ui ├── demo39_lanzar_archivo_gui_ui.py ├── demo40_traduccion_gui.py ├── demo41_aplicacion.py ├── demo42_traduccion_gui.py ├── demo43_traduccion_gui.py ├── demo44_aplicacion_calculadora.py ├── demo44_calculadora_basica.py ├── demo44_calculadora_basica.ui ├── demo45_aplicacion_saludo.py ├── demo45_saludo.py ├── demo45_saludo.ui ├── demo46_aplicacion_seleccion_vuelo.py ├── demo46_seleccion_vuelo.py ├── demo46_seleccion_vuelo.ui ├── demo47_aplicacion_venta.py ├── demo47_venta.py ├── demo47_venta.ui ├── demo48_aplicacion_pizzeria.py ├── demo48_pizzeria.py ├── demo48_pizzeria.ui ├── demo49_aplicacion_inicio_sesion.py ├── demo49_inicio_sesion.py ├── demo49_inicio_sesion.ui ├── demo50_aplicacion_heladeria.py ├── demo50_heladeria.py ├── demo50_heladeria.ui ├── demo51_aplicacion_segniales_slots.py ├── demo51_segniales_slots.py ├── demo51_segniales_slots.ui ├── demo52_aplicacion_calculadora.py ├── demo52_calculadora.py ├── demo52_calculadora.ui ├── demo53_aplicacion_punto_venta.py ├── demo53_punto_venta.py ├── demo53_punto_venta.ui ├── demo54_aplicacion_niveles.py ├── demo54_niveles.py ├── demo54_niveles.ui ├── demo55_aplicacion_diagnosticos.py ├── demo55_diagnosticos.py ├── demo55_diagnosticos.ui ├── demo56_aplicacion_diagnosticos.py ├── demo56_diagnosticos.py ├── demo56_diagnosticos.ui ├── demo57_aplicacion_comidas_favoritas.py ├── demo57_comidas_favoritas.py ├── demo57_comidas_favoritas.ui ├── demo58_aplicacion_editor_comidas_favoritas.py ├── demo58_editor_comidas_favoritas.py ├── demo58_editor_comidas_favoritas.ui ├── demo59_aplicacion_seleccion_lenguaje.py ├── demo59_seleccion_lenguaje.py ├── demo59_seleccion_lenguaje.ui ├── demo60_aplicacion_editor_texto.py ├── demo60_editor_texto.py ├── demo60_editor_texto.ui ├── demo61_aplicacion_editor_texto.py ├── demo61_editor_texto.py ├── demo61_editor_texto.ui ├── demo62_aplicacion_gestor_descargas.py ├── demo62_gestor_descargas.py ├── demo62_gestor_descargas.ui ├── demo63_aplicacion_visor.py ├── demo63_visor.py ├── demo63_visor.ui ├── demo64_aplicacion_reloj_digital.py ├── demo64_reloj_digital.py ├── demo64_reloj_digital.ui ├── demo65_aplicacion_calendario.py ├── demo65_calendario.py ├── demo65_calendario.ui ├── demo66_aplicacion_hotel.py ├── demo66_hotel.py ├── demo66_hotel.ui ├── demo67_aplicacion_tabla_lenguajes.py ├── demo67_tabla_lenguajes.py ├── demo67_tabla_lenguajes.ui ├── demo68_aplicacion_registro_estudiante.py ├── demo68_registro_estudiante.py ├── demo68_registro_estudiante.ui ├── demo69_aplicacion_registro_profesor_emerito.py ├── demo69_registro_profesor_emerito.py ├── demo69_registro_profesor_emerito.ui ├── demo70_aplicacion_seleccion_pais.py ├── demo70_seleccion_pais.py ├── demo70_seleccion_pais.ui ├── demo71_aplicacion_selector_color.py ├── demo71_selector_color.py ├── demo71_selector_color.ui ├── demo72_aplicacion_selector_fuente.py ├── demo72_selector_fuente.py ├── demo72_selector_fuente.ui ├── demo73_aplicacion_editor_texto.py ├── demo73_editor_texto.py ├── demo73_editor_texto.ui ├── demo74_aplicacion_contenedor_ventanas.py ├── demo74_contenedor_ventanas.py ├── demo74_contenedor_ventanas.ui ├── demo75_aplicacion_restaurante_pedidos.py ├── demo75_restaurante_pedidos.py ├── demo75_restaurante_pedidos.ui ├── demo76_aplicacion_editor_grafico.py ├── demo76_editor_grafico.py ├── demo76_editor_grafico.ui ├── demo77_aplicacion_descarga_archivo.py ├── demo77_descarga_archivo.py ├── demo77_descarga_archivo.ui ├── demo78_aplicacion_descarga_analisis.py ├── demo78_descarga_analisis_archivo.py ├── demo78_descarga_analisis_archivo.ui ├── demo79_aplicacion_descarga_analisis_async.py ├── demo79_descarga_analisis_async.py ├── demo79_descarga_analisis_async.ui ├── demo80.db ├── demo80_aplicacion_creacion_base_datos.py ├── demo80_creacion_base_datos.py ├── demo80_creacion_base_datos.ui ├── demo81_aplicacion_base_datos_sqlite.py ├── demo81_base_datos_sqlite.py ├── demo81_base_datos_sqlite.ui ├── demo82.db ├── demo82_aplicacion_insercion_registros.py ├── demo82_insercion_registros.py ├── demo82_insercion_registros.ui ├── demo83.db ├── demo83_aplicacion_consulta_base_datos.py ├── demo83_consulta_base_datos.py ├── demo83_consulta_base_datos.ui ├── demo84.db ├── demo84_aplicacion_busqueda_datos.py ├── demo84_busqueda_datos.py ├── demo84_busqueda_datos.ui ├── demo85.db ├── demo85_aplicacion_navegacion_registros.py ├── demo85_navegacion_registros.py ├── demo85_navegacion_registros.ui ├── demo86.db ├── demo86_aplicacion_inicio_sesion.py ├── demo86_hashing.py ├── demo86_inicio_sesion.py ├── demo86_inicio_sesion.ui ├── demo87.db ├── demo87_aplicacion_cambio_clave.py ├── demo87_cambio_clave.py ├── demo87_cambio_clave.ui ├── demo88.db ├── demo88_aplicacion_remocion_cuenta.py ├── demo88_remocion_cuenta.py ├── demo88_remocion_cuenta.ui ├── demo89_aplicacion_puntero_mouse.py ├── demo89_posicion_puntero_mouse.py ├── demo89_posicion_puntero_mouse.ui ├── demo90_aplicacion_dibujo_punto.py ├── demo90_dibujo_punto.py ├── demo90_dibujo_punto.ui ├── demo91_aplicacion_dibujo_linea.py ├── demo91_dibujo_linea.py ├── demo91_dibujo_linea.ui ├── demo92_aplicacion_dibujo_lineas.py ├── demo92_dibujo_lineas.py ├── demo92_dibujo_lineas.ui ├── demo93_aplicacion_dibujo_circulo.py ├── demo93_dibujo_circulo.py ├── demo93_dibujo_circulo.ui ├── demo94_aplicacion_dibujo_rectangulo.py ├── demo94_dibujo_rectangulo.py ├── demo94_dibujo_rectangulo.ui ├── demo95_aplicacion_dibujo_texto.py ├── demo95_dibujo_texto.py ├── demo95_dibujo_texto.ui ├── demo96_animacion_objeto.py ├── demo96_animacion_objeto.ui ├── demo96_aplicacion_animacion_objeto.py ├── demo97_aplicacion_datos_ubicacion.py ├── demo97_datos_ubicacion.py ├── demo97_datos_ubicacion.ui ├── demo98_aplicacion_ubicacion.py ├── demo98_ubicacion_latitud_longitud.py ├── demo98_ubicacion_latitud_longitud.ui ├── demo99_aplicacion_distancia.py ├── demo99_distancia_ubicaciones.py ├── demo99_distancia_ubicaciones.ui ├── ex1-iconos-recursos.qrc ├── ex1_aplicacion_graficos.py ├── ex1_graficos.py ├── ex1_graficos.ui ├── ex1_iconos_recursos.py ├── ex1_iconos_recursos.qrc ├── ex2_gestor_inventario.ui ├── ex2_producto_buscar.ui ├── ex2_producto_cambiar_disponibilidad.ui ├── ex2_producto_crear.ui ├── ex2_producto_vender.ui ├── ex2_reporte_top_5.ui ├── ex2_reporte_ventas_rango_fechas.ui ├── lineaIcon.ico ├── new.png ├── open.png ├── proyecto0 │ ├── inventario │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── ex2_gestor_inventario.py │ │ ├── ex2_gestor_inventario.ui │ │ ├── ex2_producto_buscar.py │ │ ├── ex2_producto_buscar.ui │ │ ├── ex2_producto_cambiar_disponibilidad.py │ │ ├── ex2_producto_cambiar_disponibilidad.ui │ │ ├── ex2_producto_crear.py │ │ ├── ex2_producto_crear.ui │ │ ├── ex2_producto_vender.py │ │ ├── ex2_producto_vender.ui │ │ ├── ex2_reporte_top_5.py │ │ ├── ex2_reporte_top_5.ui │ │ ├── ex2_reporte_ventas_rango_fechas.py │ │ ├── ex2_reporte_ventas_rango_fechas.ui │ │ ├── inventario.pickle │ │ ├── inventario_funciones.py │ │ └── modelos │ │ │ ├── __init__.py │ │ │ ├── inventario.py │ │ │ ├── producto.py │ │ │ └── venta.py │ └── setup.py ├── pyqt_logo.png ├── rectanguloIcon.ico └── save.png ├── parte18 ├── Parte18-Ejercicios.txt ├── demo01_introduccion_tkinter.py ├── demo02_ventana_tkinter.py ├── demo03_ventana_mensaje.py ├── demo03_ventana_mensaje_oop.py ├── demo04_dialogo_mensaje_messagebox.py ├── demo05_mensaje_saludo_click_boton.py ├── demo06_mensaje_saludo_terminar.py ├── demo07_captura_datos.py ├── demo08_lista_desplegable_combobox.py ├── demo09_casilla_comprobacion_checkbox.py ├── demo10_seleccion_excluiva_radiobutton.py ├── demo11_registro_usuario.py ├── demo12_calculadora_spinbox.py ├── demo13_barra_progreso_progressbar.py ├── demo14_lista_elementos_listbox.py ├── demo15_area_texto_scrolledtext.py ├── demo16_selector_dato_scale.py ├── demo17_apertura_archivo.py ├── demo18_guardar_archivo.py ├── demo19_organizacion_gui_panedwindow.py ├── demo20_barra_menus.py ├── demo21_pestanas_tabs.py ├── demo22_formulario_inicio_sesion.py ├── demo23_botones_colores.py ├── demo24_cambio_color_boton.py ├── demo25_colores_fondo.py ├── demo26_bandera.py ├── demo27_grilla_grid.py ├── demo28_grilla_grid_autoajustable.py ├── demo29_posicion_etiquetas_extremos_ventana.py ├── demo30_botones_4_esquinas.py ├── demo31_conversion_temperatura.py ├── demo32_editor_texto.py ├── demo33_calculadora.py ├── demo34_deteccion_pulsacion_click.py ├── demo35_imagen.py ├── demo35_python_logo.jpg ├── demo35_python_logo.png ├── demo36_contador.py ├── demo37_pil.py ├── demo38_imagenes_gui_pillow.py ├── demo39_cargar_imagenes.py ├── demo40_gestion_lenguajes_programacion.py ├── demo41_aplicacion_login.py ├── demo42_app_contactos.py ├── demo42_contactos.txt ├── demo43_calculadora.py ├── demo44_circulo.py ├── demo45_plot.py ├── demo46_tamagnio_flecha.py ├── demo47_ovalos.py ├── demo48_eventos_canvas.py ├── demo49_efecto_botones.py ├── demo50_dibujo.py ├── demo51_imagen_canvas.py ├── demo52_botón_menú.py ├── demo53_dialogo_color.py ├── demo54_barra_progreso.py ├── demo55_menu_contextual_boton.py ├── demo56_tema_colores.py ├── demo57_ventana_pantallla_completa.py ├── demo58_area_texto_spinbox.py ├── demo59_app_comentarios.py ├── demo59_comentarios.txt ├── demo60_copia_texto_app.py ├── demo61_validacion_datos_campos.py ├── demo62_meses_tabs.py ├── demo63_uso_basico_requests.py ├── demo64_cielo.jpg ├── demo64_estado_clima_app.py ├── demo65_github_usuario.py ├── demo65_perfil.jpg ├── demo65_perfil.png ├── demo66_componentes.db ├── demo66_gestor_accesorios_computadores.py ├── demo67_descargador_html_app.py ├── demo67_multiples_hilos.py ├── demo68_gestor_descargas_app.py ├── demo70_configuracion_botones.py ├── demo71_trastro_campo_texto_stringvar.py ├── demo72_validacion_campo_texto.py ├── demo73_demo_uso_scale_spinbox.py ├── demo74_seleccion_color.py ├── demo75_modos_seleccion_lista.py ├── demo76_eventos_mouse_ventana.py ├── demo77_eventos_teclado.py ├── demo78_icono.ico ├── demo78_icono_ventana.py ├── demo79_seleccion_listas.py ├── demo80_organizacion_interfaz.py ├── demo81_formulario_registro.py ├── demo82_formulario_registro.py ├── demo83_apariencia_componentes.py ├── demo84_cambio_fuente_texto.py ├── demo85_opciones_base_datos.py ├── demo86_cambiar_cursores_mouse.py ├── demo87_texto_etiquetas.py ├── demo88_mensajes_alerta.py ├── demo89_mensajes_confirmacion.py ├── demo90_archivos_carpetas_seleccion.py ├── demo91_guardar_contenido.py ├── demo91_python.txt ├── demo92_barra_menu.py ├── demo93_menu_radio_checkbox.py ├── demo94_menu_contextual.py ├── demo95_contactos.csv ├── demo95_visor_lista_contactos.py ├── demo96_contactos.db ├── demo96_migracion_datos.py ├── demo96_visor_lista_contactos.py ├── demo97_descargador_html.py ├── demo98_gestor_productos.py ├── demo99_extra.py ├── demo99_lectura_datos_api.py ├── productos.db ├── proyecto0 │ ├── inventario │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── exportados │ │ │ ├── inventario-20230525.json │ │ │ ├── inventario-20230525.xlsx │ │ │ ├── productos-20230524.csv │ │ │ └── ventas-20230524.csv │ │ ├── inventario.pickle │ │ ├── inventario_funciones.py │ │ └── modelos │ │ │ ├── __init__.py │ │ │ ├── inventario.py │ │ │ ├── producto.py │ │ │ ├── test │ │ │ └── ventana_mdi.py │ │ │ └── venta.py │ └── setup.py ├── python-logo-black.gif ├── python-logo-black.png ├── python-logo-file-black.png ├── python-logo-name-black.png └── python-logo.png ├── parte19_proyecto1_scraping ├── __init__.py ├── demo_beautifulsoup.py ├── demo_flet.py ├── main.py ├── tabla.csv ├── tabla_1.csv └── tabla_2.csv ├── parte20_inventario_flet ├── __init__.py ├── inventario │ ├── __init__.py │ ├── __main__.py │ ├── conexion.py │ ├── exportados │ │ ├── inventario-20230525.json │ │ ├── inventario-20230525.xlsx │ │ ├── productos-20230524.csv │ │ └── ventas-20230524.csv │ ├── inventario.db │ └── modelos │ │ ├── __init__.py │ │ ├── inventario.py │ │ ├── producto.py │ │ ├── test │ │ └── ventana_mdi.py │ │ └── venta.py └── setup.py ├── parte21_intro_base_datos └── __init__.py └── requirements.txt /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.fontSize": 19, 3 | "editor.minimap.enabled": true, 4 | "editor.wordWrap": "on", 5 | "code-runner.executorMap": { 6 | "python": "D:\\Dropbox\\Pro\\Cursos\\Python-CursoV2\\Scripts\\activate.bat && python -u", 7 | }, 8 | "terminal.integrated.fontSize": 19, 9 | "python.linting.pylintEnabled": false 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-CursoV2 2 | Curso práctico con proyectos del lenguaje de programación Python. 3 | -------------------------------------------------------------------------------- /etc/demo.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | # Muestra el valor de la constante Euler: 4 | print(math.e) 5 | 6 | # Muestra el valor de la constante Pi: 7 | print(math.pi) 8 | 9 | # Calcula el seno de Pi: 10 | print(math.sin(math.pi)) 11 | -------------------------------------------------------------------------------- /etc/demo_idle.py: -------------------------------------------------------------------------------- 1 | print(2 + 2) 2 | print('Python v. 3.8.1') 3 | 4 | import math 5 | 6 | print(math.e) 7 | print(math.pi) 8 | print(math.sin(math.pi)) 9 | 10 | numeros = [2, 3, 5, 7, 11, 13, 17] 11 | print(len(numeros)) 12 | print(sum(numeros)) 13 | print(min(numeros)) 14 | print(max(numeros)) 15 | 16 | for n in numeros: 17 | print(n) 18 | -------------------------------------------------------------------------------- /parte04/4.1_primer_programa.py: -------------------------------------------------------------------------------- 1 | def sumar(a, b): 2 | suma = a + b 3 | return suma 4 | 5 | numero_1 = int(input('Ingrese el primer número: ')) 6 | numero_2 = int(input('Ingrese el segundo número: ')) 7 | 8 | resultado = sumar(numero_1, numero_2) 9 | 10 | print('La suma de {} y {} es igual {}.'.format(numero_1, numero_2, resultado)) 11 | -------------------------------------------------------------------------------- /parte04/4.2_primer_programa.py: -------------------------------------------------------------------------------- 1 | def sumar(a, b): 2 | suma = a + b 3 | return suma 4 | 5 | numero_1 = float(input('Ingrese el primer número: ')) 6 | numero_2 = float(input('Ingrese el segundo número: ')) 7 | 8 | resultado = sumar(numero_1, numero_2) 9 | 10 | print('La suma de {} y {} es igual {}.'.format(numero_1, numero_2, resultado)) 11 | -------------------------------------------------------------------------------- /parte04/4.3_variables.py: -------------------------------------------------------------------------------- 1 | edad = 29 2 | dias_vividos = edad * 365 3 | 4 | print(edad) 5 | print(dias_vividos) 6 | 7 | print('Tipo de dato de la variable edad:', type(edad)) 8 | print('Tipo de dato de la variable dias_vividos:', type(dias_vividos)) 9 | 10 | print() 11 | 12 | print('Posición en memoria de la variable edad:', id(edad)) 13 | print('Posición en memoria de la variable dias_vividos:', id(dias_vividos)) 14 | 15 | print() 16 | 17 | print('Posición en memoria del valor 29:', id(29)) 18 | print('Posición en memoria del valor 10585:', id(10585)) 19 | -------------------------------------------------------------------------------- /parte04/4.4_variables_cadenas_caracteres.py: -------------------------------------------------------------------------------- 1 | nombre = 'Edward' 2 | apellido = "Ortiz" 3 | nombre_completo = nombre + ' ' + apellido 4 | 5 | print('Nombre:', nombre) 6 | print('Apellido:', apellido) 7 | print('Nombre completo:', nombre_completo) 8 | 9 | print() 10 | 11 | print('Tipo de dato de la variable nombre:', type(nombre)) 12 | print('Tipo de dato de la variable apellido:', type(apellido)) 13 | print('Tipo de dato de la variable nombre_completo:', type(nombre_completo)) 14 | 15 | print() 16 | 17 | edad = 29 18 | 19 | resultado = nombre_completo + ' tiene ' + str(edad) + ' años.' 20 | print(resultado) 21 | 22 | print() 23 | 24 | resultado = '{} tiene {} años.'.format(nombre_completo, edad) 25 | print(resultado) 26 | -------------------------------------------------------------------------------- /parte04/4.5_ejercicios.txt: -------------------------------------------------------------------------------- 1 | Ejercicio 4.1: Mostrar en pantalla la versión actual de Python instalada en el sistema. 2 | 3 | Ejercicio 4.2: Mostrar en pantalla la fecha y hora actuales del sistema. 4 | 5 | Ejercicio 4.3: Solicitar al usuario el radio de un círculo y calcular su área. 6 | 7 | Ejercicio 4.4: Pedir el nombre al usuario y obtener su representación en orden inverso. 8 | 9 | Ejercicio 4.5: Calcular el área de un triángulo dadas la base y la altura. 10 | -------------------------------------------------------------------------------- /parte04/ex4.1_version_python.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Ejercicio 4.1: Mostrar en pantalla la versión actual de Python instalada en el sistema. 3 | ''' 4 | 5 | import sys 6 | 7 | print('Versión de Python:', sys.version) 8 | 9 | print() 10 | 11 | print('Información de versión:', sys.version_info) 12 | -------------------------------------------------------------------------------- /parte04/ex4.2_fecha_hora_actuales.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Ejercicio 4.2: Mostrar en pantalla la fecha y hora actuales del sistema. 3 | ''' 4 | 5 | import datetime 6 | 7 | ahora = datetime.datetime.now() 8 | 9 | print('Fecha y hora actuales:', ahora) 10 | 11 | print(type(ahora)) 12 | 13 | print() 14 | 15 | ahora_formato = ahora.strftime('%H:%M:%S %d-%m-%Y') 16 | print(ahora_formato) 17 | -------------------------------------------------------------------------------- /parte04/ex4.3_area_circulo.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Ejercicio 4.3: Solicitar al usuario el radio de un círculo y calcular su área. 3 | ''' 4 | import math 5 | 6 | radio = float(input('Digite el radio del círculo: ')) 7 | 8 | # pi * r ^ 2 9 | area = math.pi * radio ** 2 10 | 11 | print('El área es igual a:', area) 12 | -------------------------------------------------------------------------------- /parte04/ex4.4_invertir_nombre.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Ejercicio 4.4: Pedir el nombre al usuario y obtener su representación en orden inverso. 3 | ''' 4 | 5 | nombre = input('Digite su nombre: ') 6 | 7 | print('Su nombre es:', nombre) 8 | 9 | nombre_invertido = nombre[::-1] 10 | 11 | print('Su nombre invertido es:', nombre_invertido) 12 | -------------------------------------------------------------------------------- /parte04/ex4.5_area_triangulo.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Ejercicio 4.5: Calcular el área de un triángulo dadas la base y la altura. 3 | ''' 4 | 5 | base = float(input('Digite la base del triángulo: ')) 6 | altura = float(input('Digite la altura del triángulo: ')) 7 | 8 | area = base * altura / 2 9 | 10 | print('El área del triángulo es igual a {}.'.format(area)) 11 | -------------------------------------------------------------------------------- /parte05/5.01_enteros_int.py: -------------------------------------------------------------------------------- 1 | # Números enteros: 2 | 3 | puntaje = 300 4 | x = -5 5 | 6 | print(type(puntaje)) 7 | print(type(x)) 8 | 9 | print() 10 | print('Puntaje antes de la adición 50 puntos: %i' % puntaje) 11 | puntaje = puntaje + 50 # puntaje += 50 12 | print('Puntaje después de la adición 50 puntos: %i' % puntaje) 13 | print(type(puntaje)) 14 | 15 | print() 16 | 17 | print('Valor de x antes de la adición: %i' % x) 18 | x += 10 # x = x + 10 19 | print('Valor de x después de la adición: %i' % x) 20 | print('Tipo de dato de la variable `x`: %s' % type(x)) 21 | 22 | print() 23 | 24 | print('Uso de la clase int() para crear números enteros:') 25 | 26 | edad = int(input('Escriba su edad: ')) 27 | print('Tipo de dato de la variable edad: %s' % type(edad)) 28 | 29 | total_dias = edad * 365 30 | print('Total de días vividos hasta el momento: %i' % total_dias) 31 | -------------------------------------------------------------------------------- /parte05/5.02_reales_float.py: -------------------------------------------------------------------------------- 1 | # Números de punto flotante: 2 | 3 | pi = 3.1415 4 | precio = 29.95 5 | 6 | print('El valor de la variable pi es: %.4f' % pi) 7 | print('El valor de la variable precio es: %.2f' % precio) 8 | print(pi) 9 | print(precio) 10 | 11 | print() 12 | 13 | print('El tipo de dato para la variable pi: ', type(pi)) 14 | print('El tipo de dato para la variable precio: ', type(precio)) 15 | 16 | print() 17 | 18 | print('Operaciones aritméticas sobre números de punto flotante:') 19 | pi = pi * 2 20 | print('El nuevo valor de la variable pi es:', pi) 21 | 22 | total = precio * 5 23 | print('El total de la compra es: %.2f' % total) 24 | 25 | print() 26 | 27 | print('El tipo de dato para la variable pi: ', type(pi)) 28 | print('El tipo de dato para la variable total: ', type(total)) 29 | 30 | print() 31 | 32 | print('Creación de un número real (punto flotante) a partir de una cadena de caracteres:') 33 | 34 | precio_computador = float(input('Digite el precio del computador: ')) 35 | print('El tipo de dato de la variable precio_computador es %s' % type(precio_computador)) 36 | print('El computador cuesta: $%.2f' % precio_computador) 37 | -------------------------------------------------------------------------------- /parte05/5.03_complejos_complex.py: -------------------------------------------------------------------------------- 1 | # Números complejos: 2 | 3 | numero_complejo = 2 - 3j 4 | print('Contenido variable compleja:', numero_complejo) 5 | print('El tipo de dato de la variable numero_complejo es:', type(numero_complejo)) 6 | 7 | print() 8 | 9 | numero_complejo = complex(2, -3) 10 | print('Contenido variable compleja:', numero_complejo) 11 | print('El tipo de dato de la variable numero_complejo es:', type(numero_complejo)) 12 | 13 | print() 14 | 15 | print('Operaciones aritméticas sobre números complejos:') 16 | 17 | suma = 2 - 3j + (1 + 5j) 18 | print('Suma:', suma) 19 | 20 | resta = 2 - 3j - complex(1, 5) 21 | print('Resta:', resta) 22 | 23 | producto = 2 - 3j * complex(1, 5) 24 | print('Producto:', producto) 25 | 26 | division = 2 - 3j / complex(1, 5) 27 | print('División:', division) 28 | -------------------------------------------------------------------------------- /parte05/ex5.01_conversion_lista_a_tupla.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.1: Convertir una lista en una tupla. 2 | 3 | lenguajes = ['Python', 'JavaScript', 'PHP', 'C#', 'C++', 'Java'] 4 | 5 | lenguajes_tupla = tuple(lenguajes) 6 | 7 | print(lenguajes) 8 | 9 | print() 10 | 11 | print(lenguajes_tupla) 12 | print(type(lenguajes_tupla)) 13 | -------------------------------------------------------------------------------- /parte05/ex5.02_invertir_tupla.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.2: Invertir el contenido de una tupla. 2 | 3 | # (1, 2, 3, 4, 5) 4 | # (5, 4, 3, 2, 1) 5 | 6 | numeros = (1, 2, 3, 4, 5) 7 | print(numeros) 8 | 9 | print() 10 | 11 | # Solución 1: 12 | print('Solución 1:') 13 | numeros_invertidos = [] 14 | 15 | for i in range(len(numeros) - 1, -1, -1): 16 | numeros_invertidos.append(numeros[i]) 17 | 18 | numeros_invertidos = tuple(numeros_invertidos) 19 | print(numeros_invertidos) 20 | 21 | print() 22 | 23 | # Solución 2: 24 | print('Solución 2:') 25 | numeros_invertidos = tuple(reversed(numeros)) 26 | print(numeros_invertidos) 27 | -------------------------------------------------------------------------------- /parte05/ex5.03_seccion_tupla.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.3: Crear una sección de una tupla usando notación de slicing (rebanado). 2 | 3 | # (1, 2, 3, 4, 5) 4 | 5 | numeros = (1, 2, 3, 4, 5) 6 | print(numeros) 7 | 8 | print() 9 | 10 | seccion = numeros[1:4] 11 | 12 | print(seccion) 13 | -------------------------------------------------------------------------------- /parte05/ex5.04_remover_elemento_tupla.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.4: Remover un elemento (valor) de una tupla. 2 | 3 | lenguajes = ('Python', 'JavaScript', 'Perl', 'C++', 'Java') 4 | print('Contenido actual de la tupla `lenguajes`:', lenguajes) 5 | print('Cantidad de elementos de la tupla `lenguajes`:', len(lenguajes)) 6 | 7 | lenguaje = 'Perl' 8 | 9 | if lenguaje in lenguajes: 10 | 11 | # NOTA IMPORTANTE: Las tuplas no se pueden modificar. Las tuplas son inmutables. 12 | lenguajes = lenguajes[0:2] + lenguajes[3:] 13 | 14 | print() 15 | 16 | print('Contenido actual de la tupla `lenguajes`:', lenguajes) 17 | print('Cantidad de elementos de la tupla `lenguajes`:', len(lenguajes)) 18 | 19 | else: 20 | print('No existe un nombre de lenguaje con:', lenguaje) 21 | -------------------------------------------------------------------------------- /parte05/ex5.05_remover_duplicados_lista.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.5: Remover los valores duplicados en una lista. 2 | 3 | numeros = [1, 2, 3, 1, 1, 1, 4, 5, 6, 3, 3, 2, 5] 4 | print('Contenido actual de la lista `numeros`:', numeros) 5 | print('Cantidad actual de la lista `numeros`:', len(numeros)) 6 | 7 | print() 8 | 9 | # Solución #1: 10 | print('Solución #1:') 11 | numeros_sin_repetir = [] 12 | 13 | for n in numeros: 14 | if n not in numeros_sin_repetir: 15 | numeros_sin_repetir.append(n) 16 | 17 | print('Contenido actual de la lista `numeros_sin_repetir`:', numeros_sin_repetir) 18 | print('Cantidad actual de la lista `numeros_sin_repetir`:', len(numeros_sin_repetir)) 19 | 20 | print() 21 | 22 | # Solución #2: 23 | print('Solución #2') 24 | conjunto_numeros = list(set(numeros)) 25 | print('Contenido actual de `conjunto_numeros`:', conjunto_numeros) 26 | print('Cantidad actual de conjunto_numeros`:', len(conjunto_numeros)) 27 | -------------------------------------------------------------------------------- /parte05/ex5.06_palabras_longitud_mayor_o_igual_5.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.6: Encontrar las palabras de una lista que tienen al menos 5 caracteres de longitud. 2 | 3 | paises = ['Colombia', 'Perú', 'Alemania', 'Estados Unidos', 'China', 'Argentina', 'Irán', 'Irak'] 4 | 5 | print('Contenido actual de la variable `paises`:', paises) 6 | print('Cantidad actual de elementos de la variable `paises`:', len(paises)) 7 | 8 | print() 9 | 10 | # Solución #1: 11 | print('Solución #1') 12 | paises_mas_5_caracteres = [] 13 | 14 | for p in paises: 15 | if len(p) >= 5: 16 | paises_mas_5_caracteres.append(p) 17 | 18 | print('Contenido actual de la variable `paises_mas_5_caracteres`:', paises_mas_5_caracteres) 19 | print('Cantidad actual de elementos de la variable `paises_mas_5_caracteres`:', len(paises_mas_5_caracteres)) 20 | 21 | print() 22 | 23 | # Solución #2: 24 | print('Solución #2') 25 | 26 | paises_mas_5_caracteres = [p for p in paises if len(p) >= 5] 27 | print('Contenido actual de la variable `paises_mas_5_caracteres`:', paises_mas_5_caracteres) 28 | print('Cantidad actual de elementos de la variable `paises_mas_5_caracteres`:', len(paises_mas_5_caracteres)) 29 | -------------------------------------------------------------------------------- /parte05/ex5.07_elemento_aleatorio_lista.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.7: Seleccionar de forma aleatoria un elemento de una lista. 2 | 3 | import random 4 | 5 | numeros = list(range(1, 7)) 6 | 7 | numero = random.choice(numeros) 8 | 9 | print('Se ha seleccionado de forma aleatoria el valor:', numero) 10 | -------------------------------------------------------------------------------- /parte05/ex5.08_frecuencia_elementos_lista.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.8: Calcular la frecuencia (ocurrencias) de los elementos de una lista. 2 | 3 | from collections import Counter 4 | 5 | numeros = [1, 2, 3, 1, 1, 1, 4, 5, 6, 3, 3, 2, 5] 6 | print('Contenido actual de la lista `numeros`:', numeros) 7 | print('Cantidad actual de elementos de la lista `numeros`:', len(numeros)) 8 | 9 | print() 10 | 11 | # Solución #1: 12 | print('Solución #1') 13 | 14 | frecuencia = {} 15 | 16 | for n in numeros: 17 | if n in frecuencia: 18 | frecuencia[n] += 1 19 | else: 20 | frecuencia[n] = 1 21 | 22 | print('Contenido actual del diccionario `frecuencia`:', frecuencia) 23 | print('Cantidad actual de elementos del diccionario `frecuencia`:', len(frecuencia)) 24 | 25 | print() 26 | 27 | # Solución #2: 28 | print('Solución #2') 29 | 30 | contador = Counter(numeros) 31 | print('Contenido actual de la variable `contador`:', contador) 32 | -------------------------------------------------------------------------------- /parte05/ex5.09_suma_valores_diccionario.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.9: Sumar todos los valores de un diccionario. 2 | 3 | productos = {'Mouse': 29.9, 'Teclado': 119.9, 'Audífonos': 35.9, 'Monitor': 299} 4 | 5 | total = sum(productos.values()) 6 | 7 | print('El total de los productos es:', total) 8 | -------------------------------------------------------------------------------- /parte05/ex5.10_remover_duplicados_diccionario.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.10: Remover todos los elementos duplicados de un diccionario. 2 | 3 | productos = {1001: 'Mouse', 1002: 'Teclado', 1003: 'Monitor', 1004: 'Mouse', 1005: 'Audífonos', 1006: 'Teclado'} 4 | 5 | print('Contenido actual del diccionario `productos`:', productos) 6 | print('Cantidad actual de elementos del diccionario `productos`:', len(productos)) 7 | 8 | print() 9 | 10 | productos_unicos = {} 11 | 12 | for k, v in productos.items(): 13 | if v not in productos_unicos.values(): 14 | productos_unicos[k] = v 15 | 16 | print('Contenido actual del diccionario `productos_unicos`:', productos_unicos) 17 | print('Cantidad actual de elementos del diccionario `productos_unicos`:', len(productos_unicos)) 18 | -------------------------------------------------------------------------------- /parte05/ex5.11_top_3_valores_diccionario.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.11: Encontrar los tres valores mayores en un diccionario. 2 | 3 | from heapq import nlargest 4 | 5 | productos = {'Mouse': 29.9, 'Teclado': 119.9, 'Audífonos': 35.9, 'Monitor': 299} 6 | 7 | productos_mas_caros_3 = nlargest(3, productos, key=productos.get) 8 | 9 | print('Los tres productos más caros son:', productos_mas_caros_3) 10 | -------------------------------------------------------------------------------- /parte05/ex5.12_conversion_diccionario_json.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.12: Convertir un diccionario en su representación en el formato JSON. 2 | 3 | import json 4 | 5 | productos = {'Mouse': 29.9, 'Teclado': 119.9, 'Audífonos': 35.9, 'Monitor': 299} 6 | 7 | print('Contenido actual del diccionario `productos`:', productos) 8 | print('El tipo de dato de la variable `productos` es:', type(productos).__name__) 9 | 10 | print() 11 | 12 | productos_json = json.dumps(productos) 13 | print('Contenido actual de la variable `productos_json`:', productos_json) 14 | print('El tipo de dato de la variable `productos_json` es:', type(productos_json).__name__) 15 | -------------------------------------------------------------------------------- /parte05/ex5.13_union_interseccion_conjuntos.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.13: Realizar operaciones de unión e intersección de conjuntos. 2 | 3 | numeros = set(list(range(1, 11))) 4 | primos = set([2, 3, 5, 7, 11, 13, 17, 19]) 5 | 6 | print('Contenido del conjunto `numeros`:', numeros) 7 | print('Contenido del conjunto `primos`:', primos) 8 | 9 | print() 10 | 11 | union = numeros.union(primos) 12 | print('Contenido del conjunto `union`:', union) 13 | print('Cantidad de elementos del conjunto `union`:', len(union)) 14 | 15 | print() 16 | 17 | interseccion = primos.intersection(numeros) 18 | print('Contenido del conjunto `interseccion`:', interseccion) 19 | print('Cantidad de elementos del conjunto `interseccion`:', len(interseccion)) 20 | -------------------------------------------------------------------------------- /parte05/ex5.14_diferencia_conjuntos.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.14: Calcular la diferencia entre dos conjuntos. 2 | 3 | escritorio = {'Notepad++', 'Atom', 'Eclipse', 'NetBeans', 'PyCharm'} 4 | portatil = {'Notepad++', 'PyCharm', 'Visual Studio Code', 'IntelliJ IDEA'} 5 | 6 | resultado = escritorio.difference(portatil) 7 | 8 | print('Los programas que hacen falta en el computador portátil son:', resultado) 9 | 10 | print() 11 | 12 | resultado = portatil.difference(escritorio) 13 | print('Los programas que hacen falta en el computador de escritorio son:', resultado) 14 | -------------------------------------------------------------------------------- /parte05/ex5.15_diferencia_simetrica_conjuntos.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5.15: Calcular la diferencia simétrica entre dos conjuntos. 2 | 3 | escritorio = {'Notepad++', 'Atom', 'Eclipse', 'NetBeans', 'PyCharm'} 4 | portatil = {'Notepad++', 'PyCharm', 'Visual Studio Code', 'IntelliJ IDEA'} 5 | 6 | resultado = escritorio.symmetric_difference(portatil) 7 | 8 | print('Contenido del conjunto `resultado`:', resultado) 9 | -------------------------------------------------------------------------------- /parte06/6.03_operadores_logicos.py: -------------------------------------------------------------------------------- 1 | # Operadores Lógicos 2 | 3 | # Operador lógico Y: and 4 | 5 | edad = 19 6 | nombre = 'Daniela' 7 | 8 | resultado = edad >= 18 and nombre == 'Daniela' 9 | print('¿La persona se llama Daniela y es mayor de edad?: {}'.format(resultado)) 10 | 11 | edad = 17 12 | resultado = edad >= 18 and nombre == 'Daniela' 13 | print('¿La persona se llama Daniela y es mayor de edad?: {}'.format(resultado)) 14 | 15 | print() 16 | 17 | # Operador Lógico O: or 18 | 19 | edad = 23 20 | profesion = 'Programador' 21 | 22 | califica = edad > 20 or profesion == 'Programador' 23 | print('¿La persona tiene más de 20 años o es programadora?:', califica) 24 | 25 | edad = 17 26 | profesion = 'Ingeniero' 27 | 28 | califica = edad > 20 or profesion == 'Programador' 29 | print('¿La persona tiene más de 20 años o es programadora?:', califica) 30 | 31 | print() 32 | 33 | # Operador lógico de negación de verdad: not 34 | print('Operador lógico de negación de verdad: not') 35 | 36 | llueve = True 37 | 38 | print('Contenido de la variable `llueve`:', llueve) 39 | 40 | llueve = not llueve 41 | print('Contenido de la variable `llueve`:', llueve) 42 | 43 | print() 44 | 45 | edad = 17 46 | resultado = not edad < 18 47 | print('Resultado:', resultado) 48 | 49 | edad = 19 50 | resultado = not edad < 18 51 | print('Resultado:', resultado) 52 | -------------------------------------------------------------------------------- /parte06/6.07_linealizacion_expresiones_algebraicas.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | # Linealización de expresiones algebraicas a expresiones programáticas. 4 | 5 | # Ejemplo 1. Linealizar ecuación cuadrática. 6 | 7 | a = 1 8 | b = 0 9 | c = -1 10 | 11 | x_1 = (-b + (b**2 - 4*a*c)**(1/2)) / (2*a) 12 | x_2 = (-b - (b**2 - 4*a*c)**(1/2)) / (2*a) 13 | 14 | print('Solución 1 (x_1):', x_1) 15 | print('Solución 1 (x_2):', x_2) 16 | 17 | print() 18 | 19 | # Ejemplo 2. X^2 + 4YZ 20 | 21 | x = 1 22 | y = 2 23 | z = 3 24 | 25 | resultado = x**2 + 4*y*z 26 | print('Resultado:', resultado) 27 | 28 | print() 29 | 30 | # Ejemplo 3. 31 | 32 | resultado = (x + y)/z + 3*x/5 + 4*y 33 | print('Resultado:', resultado) 34 | 35 | print() 36 | 37 | # Ejemplo 4. 38 | 39 | c = 5 40 | d = 3 41 | 42 | resultado = (4*x**2 - 2*x + 8) / (c - d) 43 | print('Resultado:', resultado) 44 | 45 | # Ejemplo 5. 46 | 47 | resultado = 4/3 * math.pi 48 | print('Resultado:', resultado) 49 | -------------------------------------------------------------------------------- /parte06/6.08_ejercicios.txt: -------------------------------------------------------------------------------- 1 | Ejercicio 1. Convertir grados a radianes. 2 | 3 | Ejercicio 2. Convertir radianes a grados. 4 | 5 | Ejercicio 3. Calcular área de un trapezoide. 6 | 7 | Ejercicio 4. Calcular el área superficial y el volumen de un cilindro. 8 | 9 | Ejercicio 5. Calcular el valor discriminante de una expresión cuadrática. 10 | 11 | Ejercicio 6. Convertir expresiones algebraicas a expresiones programáticas. 12 | -------------------------------------------------------------------------------- /parte06/ex6.1_conversion_grados_radianes.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 1. Convertir grados a radianes. 2 | 3 | from math import pi 4 | 5 | grados = float(input('Digite los grados: ')) 6 | 7 | radianes = pi * grados / 180 8 | 9 | print('{} grados son equivalentes a {} radianes'.format(grados, radianes)) 10 | -------------------------------------------------------------------------------- /parte06/ex6.2_conversion_radianes_grados.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 2. Convertir radianes a grados. 2 | 3 | from math import pi 4 | 5 | radianes = float(input('Digite los grados: ')) 6 | 7 | grados = 180 * radianes / pi 8 | 9 | print('{} radianes equivalen a {} grados'.format(radianes, grados)) 10 | -------------------------------------------------------------------------------- /parte06/ex6.3_area_trapezoide.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 3. Calcular área de un trapezoide. 2 | 3 | base_inferior = float(input('Escriba la base inferior (B): ')) 4 | base_superior = float(input('Escriba la base inferior (b): ')) 5 | altura = float(input('Escriba la altura (h): ')) 6 | 7 | area = (base_inferior + base_superior) / 2 * altura 8 | 9 | print('El área del trapezoide es igual a:', area) 10 | -------------------------------------------------------------------------------- /parte06/ex6.4_area_volumen_cilindro.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 4. Calcular el área superficial y el volumen de un cilindro. 2 | 3 | from math import pi 4 | 5 | radio = float(input('Escriba el radio del cilindro: ')) 6 | altura = float(input('Escriba la altura del cilindro: ')) 7 | 8 | area_superficial = 2 * pi * radio ** 2 + 2 * pi * radio * altura 9 | 10 | volumen = pi * radio **2 * altura 11 | 12 | print('El área del cilindro es:', area_superficial) 13 | print('El volumen del cilindro es:', volumen) 14 | -------------------------------------------------------------------------------- /parte06/ex6.5_discriminante_ecuacion_cuadratica.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 5. Calcular el valor discriminante de una expresión cuadrática. 2 | 3 | a = 1 4 | b = 0 5 | c = -1 6 | 7 | discriminante = b**2 - 4*a*c 8 | 9 | print('Discriminante:', discriminante) 10 | -------------------------------------------------------------------------------- /parte06/ex6.6_linealizacion_expresiones_algebraicas.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 6. Convertir expresiones algebraicas a expresiones programáticas. 2 | 3 | a = 1 4 | b = 2 5 | c = 3 6 | d = 16 7 | 8 | resultado = a / (b*c) / d**(1/2)**3 9 | 10 | print('Resultado:', resultado) 11 | 12 | print() 13 | 14 | e = 7 15 | 16 | resultado = (a**3)**2 - b*c/(d*e) 17 | 18 | print('Resultado:', resultado) 19 | -------------------------------------------------------------------------------- /parte07/7.1_funcion_input.py: -------------------------------------------------------------------------------- 1 | # Entrada de datos (input) - Función incorporada `input()`: 2 | 3 | print('Entrada de datos (input) - Función incorporada `input()`:') 4 | 5 | try: 6 | nombre = input('Digite su nombre: ') 7 | 8 | print('El tipo de dato de la variable `nombre` es:', type(nombre).__name__) 9 | print('El contenido de la variable `nombre` es:', nombre) 10 | except EOFError: 11 | print('El usuario ha cancelado la introducción de datos.') 12 | print('El nombre de la persona no se capturó.') 13 | 14 | print('El programa ha finalizado de forma satisfactoria.') 15 | -------------------------------------------------------------------------------- /parte07/7.2_funcion_print.py: -------------------------------------------------------------------------------- 1 | # Salida de datos (output) - Función incorporada `print()`: 2 | 3 | nombre = 'John Ortiz Ordoñez' 4 | edad = 29 5 | 6 | print('Nombre: ' + nombre, end=' - ') 7 | print('Edad: ' + str(edad)) 8 | 9 | print() 10 | 11 | print('Aprendiendo el uso de la', end=' ') 12 | print('función print()') 13 | 14 | print() 15 | 16 | # Múltiples argumentos para la función `print()`: 17 | print('Múltiples argumentos para la función `print()`:') 18 | 19 | email = 'john@mail.co' 20 | 21 | print(nombre, edad, email) 22 | 23 | print(nombre, edad, email, sep='') 24 | print(nombre, edad, email, sep=' - ') 25 | 26 | print() 27 | 28 | lenguajes = ('Python', 'JavaScript', 'C++', 'C#', 'Java') 29 | 30 | print(lenguajes) 31 | print(lenguajes[0], lenguajes[1], lenguajes[2], lenguajes[3], lenguajes[4], sep=' - ') 32 | 33 | print() 34 | 35 | # Expansión (desempaquetamiento) de una colección: 36 | print(*lenguajes, sep=' - ') 37 | -------------------------------------------------------------------------------- /parte08/8.1_condicionales_intro.py: -------------------------------------------------------------------------------- 1 | # Introducción a los condicionales. 2 | 3 | # Estudiar la sentencia `if`: 4 | 5 | edad = 17 6 | 7 | if edad <= 17: 8 | print('Ud. es menor de edad.') 9 | else: 10 | print('Ud. es mayor de edad.') 11 | 12 | print() 13 | 14 | if edad < 18: 15 | print('Ud. es menor de edad.') 16 | else: 17 | print('Ud. es mayor de edad.') 18 | 19 | print() 20 | 21 | edad = 29 22 | 23 | if edad < 18: 24 | print('Ud. es menor de edad.') 25 | else: 26 | print('Ud. es mayor de edad.') 27 | -------------------------------------------------------------------------------- /parte08/8.2_numero_mayor.py: -------------------------------------------------------------------------------- 1 | # Uso de condicionales para determinar si un número es mayor a otro: 2 | 3 | numero_1 = int(input('Escriba el primer número: ')) 4 | numero_2 = int(input('Escriba el segundo número: ')) 5 | 6 | if numero_1 > numero_2: 7 | print('El número {} es mayor a {}.'.format(numero_1, numero_2)) 8 | 9 | print('El programa ha finalizado.') 10 | -------------------------------------------------------------------------------- /parte08/8.3_incremento_ahorros.py: -------------------------------------------------------------------------------- 1 | # Realizar aumento sobre los ahorros dependiendo de la cantidad ahorrada: 2 | 3 | ahorro = float(input('Escriba la cantidad actual de dinero que tiene en ahorros:')) 4 | 5 | if ahorro > 0: 6 | if ahorro < 1000000: 7 | ahorro *= 1.10 8 | elif ahorro < 3000000: 9 | ahorro *= 1.07 10 | elif ahorro < 10000000: 11 | ahorro *= 1.05 12 | else: 13 | ahorro *= 1.03 14 | 15 | print('El ahorro se ha incremando a {}'.format(ahorro)) 16 | else: 17 | print('Ud. ha digitado una cantidad negativa o igual a cero.') 18 | 19 | print() 20 | 21 | print('El programa ha finalizado.') 22 | -------------------------------------------------------------------------------- /parte08/8.4_condiciones_multiples.py: -------------------------------------------------------------------------------- 1 | # Evaluación de múltiples condiciones en una cláusula (sentencia) if: 2 | 3 | numero = int(input('Escriba un número entero: ')) 4 | 5 | if numero % 5 == 0 and numero >= 20 and numero <= 40: 6 | print('El número {} es divisible entre 5 y se halla en el rango 20 a 40.'.format(numero)) 7 | else: 8 | print('El número {} no es divisible entre 5 y no se halla en el rango 20 a 40.'.format(numero)) 9 | -------------------------------------------------------------------------------- /parte08/8.5_condiciones_multiples_mejora.py: -------------------------------------------------------------------------------- 1 | # Mejora evaluación de múltiples condiciones en una cláusula (sentencia) if: 2 | 3 | numero = int(input('Escriba un número entero: ')) 4 | 5 | # numero >= 20 and numero <= 40 6 | # a <= x <= b 7 | 8 | # 20 <= numero <= 40 9 | 10 | if numero % 5 == 0 and 20 <= numero <= 40: 11 | print('El número {} es divisible entre 5 y se halla en el rango 20 a 40.'.format(numero)) 12 | else: 13 | print('El número {} no es divisible entre 5 y no se halla en el rango 20 a 40.'.format(numero)) 14 | -------------------------------------------------------------------------------- /parte08/8.6_condiciones_compuestas_operador_logico_or.py: -------------------------------------------------------------------------------- 1 | # Condición compuesta con el operador or (O lógico): 2 | 3 | agnios_experiencia = int(input('Escriba la cantidad de años de experiencia programando: ')) 4 | lenguaje = input('Escriba el lenguaje de programación que domina: ') 5 | 6 | if agnios_experiencia >= 5 or lenguaje in ['Python', 'Java', 'JavaScript']: 7 | print('Ud. ha calificado para trabajar con nosotros.') 8 | else: 9 | print('Ud. puede intentar en otra ocasión.') 10 | -------------------------------------------------------------------------------- /parte08/ex8.01_temperatura.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 1. Capturar la temperatura (sea en grados Celcius o Fahrenheit) y convertirla a la escala contraria. 2 | 3 | # 100°C, 32°F 4 | 5 | captura = input('Escriba la temperatura (e.g., 100°C, 32°F): ') 6 | 7 | escala = captura[-2:] 8 | 9 | if escala == '°C': 10 | valor = int(captura[:-2]) 11 | fahrenheit = valor * 9 / 5 + 32 12 | 13 | print('{} es equivalante a {}°F'.format(captura, fahrenheit)) 14 | elif escala == '°F': 15 | valor = int(captura[:-2]) 16 | celcius = 5/9 * (valor - 32) 17 | 18 | print('{} es equivalante a {}°C'.format(captura, celcius)) 19 | else: 20 | print('No ha escritura un valor de temperatura válido.') 21 | -------------------------------------------------------------------------------- /parte08/ex8.02_adivinar_numero.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.2. Pedir al usuario que adivine un número. Sólo un intento. 2 | 3 | import random 4 | 5 | aleatorio = random.randint(1, 10) 6 | 7 | print('Adivine un número entre 1 y 10') 8 | 9 | numero = int(input('Escriba un número: ')) 10 | 11 | if numero == aleatorio: 12 | print('¡Has ganado! ¡Muy bien!') 13 | else: 14 | print('No ha adivinado el número. El númera era %i.' % aleatorio) 15 | -------------------------------------------------------------------------------- /parte08/ex8.03_precio_producto_mayor.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.3. Comprobar el producto de mayor precio entre tres productos. 2 | 3 | precio_1 = float(input('Escriba el precio del primer producto: ')) 4 | precio_2 = float(input('Escriba el precio del segundo producto: ')) 5 | precio_3 = float(input('Escriba el precio del tercer producto: ')) 6 | 7 | # 100, 200, 300 8 | # 1000, 1000, 1000 9 | # 100, 200, 100 10 | 11 | if precio_1 > precio_2 and precio_1 > precio_3: 12 | print('El producto más costoso es %f' % precio_1) 13 | elif precio_2 > precio_1 and precio_2 > precio_3: 14 | print('El producto más costoso es %f' % precio_2) 15 | elif precio_3 > precio_1 and precio_3 > precio_2: 16 | print('El producto más costoso es %f' % precio_3) 17 | else: 18 | print('Los tres productos cuestan lo mismo.') 19 | -------------------------------------------------------------------------------- /parte08/ex8.04_recta_punto.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.4. Dada la recta y = 6x + 10, comprobar si un punto dado pertenece a ella. 2 | 3 | x = float(input('Escriba el valor de x: ')) 4 | y = float(input('Escriba el valor de y: ')) 5 | 6 | valor = 6 * x + 10 7 | 8 | if valor == y: 9 | print('El punto ({}, {}) se halla en la recta y = 6x + 10'.format(x, y)) 10 | else: 11 | print('El punto ({}, {}) no se halla en la recta y = 6x + 10'.format(x, y)) 12 | -------------------------------------------------------------------------------- /parte08/ex8.05_punto_area_rectas.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.5. Dadas las rectas y = 2x - 2, y = x + 1, x = 10 comprobar si un punto está en el área comprendida entre las rectas. 2 | 3 | x = float(input('Escriba el valor de x: ')) 4 | y = float(input('Escriba el valor de y: ')) 5 | 6 | if x <= 10: 7 | valor_1 = 2 * x - 2 8 | valor_2 = x + 1 9 | 10 | if valor_2 <= y <= valor_1: 11 | print('El punto ({}, {}) se halla en el área de las tres rectas.'.format(x, y)) 12 | else: 13 | print('El punto ({}, {}) no se halla en el área de las tres rectas.'.format(x, y)) 14 | else: 15 | print('El punto ({}, {}) no se halla en el área de las tres rectas.'.format(x, y)) 16 | -------------------------------------------------------------------------------- /parte08/ex8.06_aplicar_descuento.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.6. Aplicar descuento según la cantidad de productos comprados. Cada producto cuesta $100.000. 2 | 3 | cantidad = int(input('Digite la cantidad de productos comprados: ')) 4 | 5 | if cantidad > 0: 6 | total = cantidad * 100000 7 | 8 | if 5 <= cantidad <= 20: 9 | total *= 0.99 10 | elif 20 < cantidad <= 50: 11 | total *= 0.97 12 | elif 50 < cantidad <= 100: 13 | total *= 0.93 14 | elif cantidad > 100: 15 | total *= 0.90 16 | 17 | print('El total a pagar es igual a ${}'.format(total)) 18 | else: 19 | print('Ha digitado una cantidad inválida.') 20 | -------------------------------------------------------------------------------- /parte08/ex8.07_categorizar_jugador.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.7. Categorizar según la cantidad de puntos obtenidos por un jugador. 2 | 3 | # +----------+---------------+ 4 | # | Puntos | Categoría | 5 | # +----------+---------------+ 6 | # | 0-100 | Principiante | 7 | # +----------+---------------+ 8 | # | 101-500 | Estándar | 9 | # +----------+---------------+ 10 | # | 501-2000 | Experimentado | 11 | # +----------+---------------+ 12 | # | 2000> | Máster | 13 | # +----------+---------------+ 14 | 15 | puntos = int(input('Digite la cantidad de puntos obtenidos: ')) 16 | 17 | categoria = None 18 | 19 | if puntos <= 100: 20 | categoria = 'Principiante' 21 | elif puntos <= 500: 22 | categoria = 'Estándar' 23 | elif puntos <= 2000: 24 | categoria = 'Experimentado' 25 | else: 26 | categoria = 'Máster' 27 | 28 | print('La categoría del jugador es %s' % categoria) 29 | -------------------------------------------------------------------------------- /parte08/ex8.08_par_impar.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.8. Determinar si un número dado por el usuario es par o impar. 2 | 3 | numero = int(input('Escriba un número entero cualquiera: ')) 4 | 5 | if numero % 2 == 0: 6 | print('%i es un número par.' % numero) 7 | else: 8 | print('%i es un número impar.' % numero) 9 | -------------------------------------------------------------------------------- /parte08/ex8.09_numero_entero_es_capicua.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.9. Comprobar si un número es capicúa. 2 | 3 | # 1001 4 | # 999 5 | # 808 6 | # 807 7 | # 103 8 | 9 | numero = int(input('Digite un número entero positivo: ')) 10 | 11 | if numero >= 0: 12 | 13 | if str(numero) == str(numero)[::-1]: 14 | print('%i es capicúa.' % numero) 15 | else: 16 | print('%i no es capicúa.' % numero) 17 | 18 | else: 19 | print('El número debe ser positivo.') 20 | -------------------------------------------------------------------------------- /parte08/ex8.10_esquema_rgb.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 8.10. Validar si tres valores numéricos pueden pertenecer al esquema de colores RGB. 2 | 3 | # RGB Rojo, Verde, Azul 4 | 5 | rojo = int(input('Digite la cantidad de color rojo (0 - 255): ')) 6 | verde = int(input('Digite la cantidad de color verde (0 - 255): ')) 7 | azul = int(input('Digite la cantidad de color azul (0 - 255): ')) 8 | 9 | if 0 <= rojo <= 255 and 0 <= verde <= 255 and 0 <= azul <= 255: 10 | print('Los valores %i %i %i corresponden para el esquema RGB.' % (rojo, verde, azul)) 11 | else: 12 | print('Los valores %i %i %i NO corresponden para el esquema RGB.' % (rojo, verde, azul)) 13 | -------------------------------------------------------------------------------- /parte09/ex9.01_patron_asteriscos.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.1: Construir un patrón con el carácter asterisco. 2 | 3 | # * 4 | # * * 5 | # * * * 6 | # * * * * 7 | # * * * * * 8 | # * * * * 9 | # * * * 10 | # * * 11 | # * 12 | 13 | for i in range(9): 14 | if i <= 4: 15 | for j in range(i + 1): 16 | print('*', end=' ') 17 | else: 18 | for j in range(9 - i): 19 | print('*', end=' ') 20 | print() 21 | -------------------------------------------------------------------------------- /parte09/ex9.02_invertir_frase.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.2: Capturar una palabra o frase del usuario e invertirla. 2 | 3 | frase = input('Escriba una frase o palabra: ') 4 | 5 | print('La frase original es:', frase) 6 | 7 | # Python => nohtyP 8 | 9 | # Solución 1: 10 | 11 | frase_invertada = '' 12 | 13 | for i in range(len(frase) - 1, -1, -1): 14 | frase_invertada += frase[i] 15 | 16 | print('Frase invertida:', frase_invertada) 17 | 18 | print() 19 | 20 | frase_invertada = frase[::-1] 21 | print('Frase invertida:', frase_invertada) 22 | -------------------------------------------------------------------------------- /parte09/ex9.03_generar_numeros_fibonacci.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.3: Generar los primeros 50 números de la serie Fibonacci. 2 | 3 | # Solución: 4 | 5 | # 0 1 1 2 3 5 8 13 21 54 85 ... 6 | 7 | a = 0 8 | b = 1 9 | 10 | print(a, b, end=' ') 11 | 12 | for i in range(48): 13 | a, b = b, a + b 14 | print(b, end=' ') 15 | -------------------------------------------------------------------------------- /parte09/ex9.04_factorial_numero.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.4: Calcular el factorial de un número dado por el usuario. 2 | 3 | # Solución: 4 | 5 | # 0! = 1 6 | # 1! = 1 7 | 8 | # 5! = 1 * 2 * 3 * 4 * 5 = 120 9 | # 6! = 720 10 | 11 | numero = int(input('Digite un número entero positivo: ')) 12 | 13 | if numero >= 0: 14 | factorial = 1 15 | 16 | if numero == 0 or numero == 1: 17 | factorial = 1 18 | else: 19 | for i in range(1, numero + 1): 20 | factorial *= i 21 | 22 | print(f'{numero}! = {factorial}') 23 | else: 24 | print('MENSAJE: Ha escrito un valor negativo. La función factorial no está definida para los números negativos.') 25 | -------------------------------------------------------------------------------- /parte09/ex9.05_patron_letra_A.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.5: Construir un patrón con asteriscos que represente la letra A. 2 | 3 | # *** 4 | # * * 5 | # * * 6 | # ***** 7 | # * * 8 | # * * 9 | # * * 10 | 11 | for i in range(7): 12 | if i == 0: 13 | for j in range(5): 14 | if j != 0 and j != 4: 15 | print('*', end='') 16 | else: 17 | print(' ', end='') 18 | if i == 1 or i == 2 or 4 <= i <= 6: 19 | for j in range(5): 20 | if j == 0 or j == 4: 21 | print('*', end='') 22 | else: 23 | print(' ', end='') 24 | if i == 3: 25 | for j in range(5): 26 | print('*', end='') 27 | print() 28 | -------------------------------------------------------------------------------- /parte09/ex9.06_pares_rango_100_400.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.6: Encontrar todos los números pares que hay en el rango 100 a 400. 2 | 3 | # Solución: 4 | 5 | pares = [] 6 | 7 | for i in range(100, 401): 8 | if i % 2 == 0: 9 | pares.append(i) 10 | 11 | print('Cantidad de elementos en la lista `pares`:', len(pares)) 12 | print('Contenido de la variable `pares`:', pares) 13 | -------------------------------------------------------------------------------- /parte09/ex9.07_patron_letra_E.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.7: Construir un patrón con asteriscos que represente la letra E. 2 | 3 | # ***** 4 | # * 5 | # * 6 | # **** 7 | # * 8 | # * 9 | # ***** 10 | 11 | for i in range(7): 12 | if i == 0 or i == 6: 13 | print('*' * 5, end='') 14 | elif i == 1 or i == 2 or i == 4 or i == 5: 15 | print('*', end='') 16 | else: 17 | print('*' * 4, end='') 18 | print() 19 | -------------------------------------------------------------------------------- /parte09/ex9.08_cantidad_digitos_letras.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.8: Contar la cantidad de dígitos y letras que tiene un texto. 2 | 3 | # Solución: 4 | 5 | cantidad_letras = 0 6 | cantidad_digitos = 0 7 | 8 | frase = input('Escriba una frase: ') 9 | 10 | for c in frase: 11 | if c.isnumeric(): 12 | cantidad_digitos += 1 13 | elif c.isalpha(): 14 | cantidad_letras += 1 15 | 16 | print('Cantidad de dígitos en la frase:', cantidad_digitos) 17 | print('Cantidad de letras en la frase:', cantidad_letras) 18 | -------------------------------------------------------------------------------- /parte09/ex9.09_patron_letra_Z.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.9: Construir un patrón con asteriscos que represente la letra Z. 2 | 3 | # ******* 4 | # * 5 | # * 6 | # * 7 | # * 8 | # * 9 | # ******* 10 | 11 | for i in range(7): 12 | if i == 0: 13 | print(' ' + '*' * 7) 14 | elif i == 1: 15 | print(' ' * 5 + '*') 16 | elif i == 2: 17 | print(' ' * 4 + '*') 18 | elif i == 3: 19 | print(' ' * 3 + '*') 20 | elif i == 4: 21 | print(' ' * 2 + '*') 22 | elif i == 5: 23 | print(' ' + '*') 24 | else: 25 | print('*' * 7) 26 | -------------------------------------------------------------------------------- /parte09/ex9.10_estadisticas_basicas.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.10: Realizar cálculos de estadísticos básicos: media, mínimo, máximo. 2 | 3 | numeros = [10, 2, 3, 4, 5, 6, 7, 8, 9, 1] 4 | 5 | suma = 0 6 | 7 | for n in numeros: 8 | suma += n 9 | 10 | print('La suma es:', suma) 11 | 12 | minimo = numeros[0] 13 | 14 | for i in range(1, len(numeros)): 15 | if numeros[i] < minimo: 16 | minimo = numeros[i] 17 | 18 | print('El mínimo es:', minimo) 19 | 20 | maximo = numeros[0] 21 | 22 | for i in range(1, len(numeros)): 23 | if numeros[i] > maximo: 24 | maximo = numeros[i] 25 | 26 | print('El máximo es:', maximo) 27 | -------------------------------------------------------------------------------- /parte09/ex9.11_sumataria_productoria.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 9.11: Solicitar al usuario una cantidad arbitria de valor numéricos y luego calcular su suma y productoria. 2 | 3 | numeros = [] 4 | 5 | while True: 6 | cadena = input('Digite un número (o escriba "Salir" para terminar): ') 7 | 8 | if cadena.lower().strip() == 'salir': 9 | break 10 | 11 | numeros.append(float(cadena)) 12 | 13 | 14 | if len(numeros) > 0: 15 | suma = 0 16 | producto = 1 17 | 18 | for n in numeros: 19 | suma += n 20 | producto *= n 21 | 22 | print('Suma:', suma) 23 | print('Producto:', producto) 24 | else: 25 | print('No hay números en la lista.') 26 | -------------------------------------------------------------------------------- /parte10/10.1_excepciones.py: -------------------------------------------------------------------------------- 1 | # Excepciones en flujo de ejecución de un programa Python. 2 | 3 | try: 4 | numero = int(input('Escriba un número entero: ')) 5 | 6 | print('Contenido de la variable `numero`:', numero) 7 | print('El tipo de dato de la variable `numero` es:', type(numero)) 8 | except ValueError as e: 9 | print('ERROR: ', e) 10 | 11 | print() 12 | print('El programa ha terminado') 13 | 14 | print() 15 | 16 | # Captura segura de un número entero: 17 | print('Captura segura de un número entero:') 18 | 19 | while True: 20 | try: 21 | edad = int(input('Escribe su edad: ')) 22 | 23 | if edad > 0: 24 | if edad <= 70: 25 | break 26 | else: 27 | print('MENSAJE: La edad no debe superar los 70 años.') 28 | else: 29 | print('MENSAJE: El valor para la edad debe ser un número positivo.') 30 | except: 31 | print('MENSAJE: No ha escrito un valor válido. Intente de nuevo.') 32 | 33 | print() 34 | 35 | print('Su edad es:', edad, 'años.') 36 | -------------------------------------------------------------------------------- /parte10/10.2_excepciones_aritmetica.py: -------------------------------------------------------------------------------- 1 | # Gestión de excepciones en operaciones aritméticas - división: 2 | print('Gestión de excepciones en operaciones aritméticas - división:') 3 | 4 | # Captura del primero número - dividendo: 5 | 6 | while True: 7 | try: 8 | dividendo = float(input('Escriba el dividendo: ')) 9 | 10 | break 11 | except: 12 | print('MENSAJE: Debe escribir un valor válido. Intente de nuevo.') 13 | print() 14 | 15 | print() 16 | 17 | while True: 18 | try: 19 | divisor = float(input('Escriba el divisor: ')) 20 | 21 | break 22 | except: 23 | print('MENSAJE: Debe escribir un valor válido. Intente de nuevo.') 24 | print() 25 | 26 | try: 27 | division = dividendo / divisor 28 | 29 | print('El resultado de la división es:', division) 30 | except ZeroDivisionError as e: 31 | print('ERROR:', e) 32 | print('MENSAJE: Intento de división entre cero.') 33 | -------------------------------------------------------------------------------- /parte10/10.3_indices_lista.py: -------------------------------------------------------------------------------- 1 | # Gestión de excepciones para acceso a elementos de una lista: 2 | 3 | lenguajes = ['Python', 'C++', 'JavaScript', 'C#', 'Java', 'C'] 4 | 5 | print('Cantidad de elementos de la lista `lenguajes`:', len(lenguajes)) 6 | 7 | print('Primer elemento de la lista `lenguajes`:', lenguajes[0]) 8 | 9 | print() 10 | 11 | indice = 6 12 | 13 | try: 14 | print('Último elemento de la lista `lenguajes`:', lenguajes[indice]) 15 | except IndexError: 16 | print('El índice %i no existe en la lista `lenguajes`' % indice) 17 | 18 | # print('El programa ha finalizado.') 19 | 20 | print() 21 | 22 | # Intento de acceso a índices negativos: 23 | print('Intento de acceso a índices negativos:') 24 | 25 | print('Último elemento de la lista `lenguajes`:', lenguajes[-1]) 26 | 27 | print() 28 | 29 | indice = -7 30 | 31 | try: 32 | lenguaje = lenguajes[indice] 33 | 34 | print('Primer elemento de la lista `lenguajes`:', lenguaje) 35 | except: 36 | print('El índice {} no existe en la lista `lenguajes`.'.format(indice)) 37 | 38 | print() 39 | 40 | print('El programa Python ha terminado.') 41 | -------------------------------------------------------------------------------- /parte10/10.4_llaves_diccionario_excepcion.py: -------------------------------------------------------------------------------- 1 | # Excepciones a la hora de trabajar con diccionarios. 2 | 3 | versiones = {'Python': '3.8.1', 'Java': '12', 'JavaScript': 'ES6', 'C#': '8'} 4 | 5 | lenguaje = input('Escriba un nombre de lenguaje de programación: ') 6 | 7 | try: 8 | version = versiones[lenguaje] 9 | 10 | print('La versión de {} es {}'.format(lenguaje, version)) 11 | except KeyError as e: 12 | print('ERROR:', e) 13 | 14 | print('Fin del programa.') 15 | 16 | print() 17 | 18 | # Uso del método `get()`: 19 | print('Uso del método `get()`:') 20 | 21 | version = versiones.get('java', '1.0.0') 22 | print('La versión de {} es {}'.format('java', version)) 23 | -------------------------------------------------------------------------------- /parte10/10.5_error_atributos_clase.py: -------------------------------------------------------------------------------- 1 | # Error al intentar acceder a un atributo inexistente en una clase: 2 | 3 | class Producto: 4 | def __init__(self, codigo, nombre, precio): 5 | self.codigo = codigo 6 | self.nombre = nombre 7 | self.precio = precio 8 | 9 | 10 | computador = Producto(1001, 'Computador', 799) 11 | 12 | print('Código:', computador.codigo) 13 | print('Nombre:', computador.nombre) 14 | print('Precio:', computador.precio) 15 | 16 | try: 17 | print('Cantidad:', computador.cantidad) 18 | except AttributeError as e: 19 | print('Se está tratando de acceder a una propiedad/atributo inexistente') 20 | print('ERROR:', e) 21 | -------------------------------------------------------------------------------- /parte10/10.6_archivo_no_existente.py: -------------------------------------------------------------------------------- 1 | # Error al intentar abrir/acceder un archivo del sistema de almacenamiento: 2 | print('Error al intentar abrir/acceder un archivo del sistema de almacenamiento:') 3 | 4 | nombre_archivo = 'python.txt' 5 | 6 | try: 7 | with open(nombre_archivo, 'r') as f: 8 | for l in f.readlines(): 9 | print(l) 10 | except FileNotFoundError as e: 11 | print('ERROR:', e) 12 | -------------------------------------------------------------------------------- /parte11/11.2_argumentos_valor_referencia.py: -------------------------------------------------------------------------------- 1 | # Pasar argumentos por valor y por referencia: 2 | print('Pasar argumentos por valor y por referencia:') 3 | 4 | # 1. Pasar argumentos por valor: 5 | print('1. Pasar argumentos por valor:') 6 | 7 | def duplicar(numero): 8 | numero *= 2 # numero = numero * 2 9 | print('El número duplicado es igual a:', numero) 10 | 11 | x = 2 12 | print('El valor de la variable `x` antes de su duplicación:', x) 13 | 14 | duplicar(x) 15 | 16 | print('El valor de la variable `x` después de su duplicación:', x) 17 | 18 | print() 19 | 20 | # 2. Pasar argumentos por referencia: 21 | print('2. Pasar argumentos por referencia:') 22 | 23 | def agregar_elemento(lista): 24 | lista.append(2) 25 | 26 | numeros = [1] 27 | print('Contenido de la variable `numeros` antes de invocar `agregar_elemento`:', numeros) 28 | 29 | agregar_elemento(numeros) 30 | 31 | print('Contenido de la variable `numeros` después de invocar `agregar_elemento`:', numeros) 32 | -------------------------------------------------------------------------------- /parte11/11.3_argumentos_variables.py: -------------------------------------------------------------------------------- 1 | # Lista variable de argumentos de una función: 2 | print('Lista variable de argumentos de una función:') 3 | 4 | # def sumar(a, b): 5 | # return a + b 6 | 7 | # def sumar(a, b, c): 8 | # return a + b + c 9 | 10 | # def sumar(a, b, c, d): 11 | # return a + b + c + d 12 | 13 | # def sumar(a, b, c, d, e): 14 | # return a + b + c + d + e 15 | 16 | def sumar(*valores): 17 | suma = 0 18 | 19 | for v in valores: 20 | suma += v 21 | 22 | return suma 23 | 24 | 25 | resultado = sumar(1) 26 | print('El resultado de la suma es igual:', resultado) 27 | 28 | print() 29 | 30 | resultado = sumar(1, 2) 31 | print('El resultado de la suma es igual:', resultado) 32 | 33 | print() 34 | 35 | resultado = sumar(1, 2, 3) 36 | print('El resultado de la suma es igual:', resultado) 37 | -------------------------------------------------------------------------------- /parte11/11.4_argumentos_nombrados_variables.py: -------------------------------------------------------------------------------- 1 | # Parámetros/argumentos nombrados variables - keywords: 2 | print('Parámetros/argumentos nombrados variables - keywords:') 3 | 4 | def mostrar_identidad(**identificacion): 5 | resultado = '' 6 | 7 | if identificacion.get('documento'): 8 | resultado += 'Documento: ' + identificacion.get('documento') + '\n' 9 | if identificacion.get('nombre'): 10 | resultado += 'Nombre: ' + identificacion.get('nombre') + '\n' 11 | if identificacion.get('apellido'): 12 | resultado += 'Apellido: ' + identificacion.get('apellido') + '\n' 13 | 14 | return resultado 15 | 16 | persona = mostrar_identidad(nombre='John', apellido='Ortiz') 17 | print('Identificación:', persona) 18 | 19 | print() 20 | 21 | persona = mostrar_identidad(nombre='John', apellido='Ortiz', documento='123456789') 22 | print('Identificación:', persona) 23 | -------------------------------------------------------------------------------- /parte11/11.8_ejercicios.txt: -------------------------------------------------------------------------------- 1 | Funciones - Ejercicios: 2 | 3 | Ejercicio 11.1: Crear una función para obtener el mayor de tres números. 4 | 5 | Ejercicio 11.2: Crear una función para sumar todos los números en una lista o tupla. 6 | 7 | Ejercicio 11.3: Crear una función para multiplicar todos los números en una lista o tupla. 8 | 9 | Ejercicio 11.4: Crear una función para invertir el contenido de una cadena de caracteres. 10 | 11 | Ejercicio 11.5: A través de una función validar si un número se halla en un rango. 12 | 13 | Ejercicio 11.6: Usar una función para contar minúsculas y mayúsculas en una cadena. 14 | 15 | Ejercicio 11.7: Tomar una lista de números e identificar los números únicos. 16 | 17 | Ejercicio 11.8: Crear una función recursiva para sumar los números de una lista. 18 | 19 | Ejercicio 11.9: Crear una función recursiva para comprobar si una cadena es palíndromo. 20 | 21 | Ejercicio 11.10: Crear una función recursiva para dividir dos números. 22 | -------------------------------------------------------------------------------- /parte11/ex11.01_funcion_mayor_numeros.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 11.1: Crear una función para obtener el mayor de tres números. 2 | 3 | # a, b, c 4 | 5 | def numero_mayor(a, b, c): 6 | if a > b and a > c: 7 | return a 8 | elif b > a and b > c: 9 | return b 10 | elif c > a and c > b: 11 | return c 12 | else: 13 | return None 14 | 15 | x = 3 16 | y = 2 17 | z = 0 18 | 19 | mayor = numero_mayor(x, y, z) 20 | print(f'El número mayor entre {x}, {y}, y {z} es {mayor}') 21 | 22 | print() 23 | 24 | x = 3 25 | y = 3 26 | z = 3 27 | 28 | mayor = numero_mayor(x, y, z) 29 | if mayor: 30 | print(f'El número mayor entre {x}, {y}, y {z} es {mayor}') 31 | else: 32 | print('Los tres números son iguales. Ninguno es mayor.') 33 | -------------------------------------------------------------------------------- /parte11/ex11.06_funcion_conteo_minusculas_mayusculas.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 11.6: Usar una función para contar minúsculas y mayúsculas en una cadena. 2 | 3 | def contador_minusculas_mayusculas(texto): 4 | """ 5 | Cuenta la cantidad de minúsculas y mayúsculas que hay en un texto. 6 | 7 | Parameters: 8 | texto: Cadena de caracteres con el texto. 9 | 10 | Returns: 11 | Tupla con la cantidad de minúsculas y mayúsculas. 12 | """ 13 | if isinstance(texto, str): 14 | minusculas = 0 15 | mayusculas = 0 16 | 17 | for c in texto: 18 | if c.isalpha(): 19 | if c.islower(): 20 | minusculas += 1 21 | elif c.isupper(): 22 | mayusculas += 1 23 | 24 | return minusculas, mayusculas 25 | 26 | raise TypeError('El argumento `texto` debe ser una cadena de caracteres.') 27 | 28 | 29 | frase = 'Python es tremendo' 30 | try: 31 | resultado = contador_minusculas_mayusculas(frase) 32 | print('Cantidad minúsculas:', resultado[0]) 33 | print('Cantidad mayúsculas:', resultado[1]) 34 | except TypeError as e: 35 | print('ERROR:', e) 36 | -------------------------------------------------------------------------------- /parte11/ex11.08_suma_recursiva.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 11.8: Crear una función recursiva para sumar los números de una lista. 2 | 3 | # [1, 2, 3, 4, 5] 4 | 5 | def sumar_lista(numeros): 6 | """ 7 | Suma los elementos de una lista. 8 | 9 | Parameters: 10 | Lista de valores numéricos. 11 | 12 | Returns: 13 | Suma de los valores de la lista. 14 | """ 15 | if len(numeros) == 0: 16 | return 0 17 | else: 18 | return numeros[0] + sumar_lista(numeros[1:]) 19 | 20 | 21 | valores = [1, 2, 3, 4, 5] 22 | resultado = sumar_lista(valores) 23 | 24 | print('La suma es igual a:', resultado) 25 | -------------------------------------------------------------------------------- /parte11/ex11.09_funcion_recursiva_palindromo.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 11.9: Crear una función recursiva para comprobar si una cadena es palíndromo. 2 | 3 | # oso => oso 4 | # ana => ana 5 | # lateleletal => lateleletal 6 | # correa => aerroc 7 | 8 | def es_palindromo(palabra): 9 | """ 10 | Determina si una palabra es palíndromo. 11 | 12 | Parameters: 13 | palabra: Palabra sobre la que se realiza la comprobación. 14 | 15 | Returns: 16 | True si la palabra es palíndromo, False en caso contrario. 17 | """ 18 | if len(palabra) < 1: 19 | return True 20 | else: 21 | if palabra[0] == palabra[-1]: 22 | return es_palindromo(palabra[1:-1]) 23 | else: 24 | return False 25 | 26 | print('¿oso es palíndromo?:', es_palindromo('oso')) 27 | print('¿lateleletal es palíndromo?:', es_palindromo('lateleletal')) 28 | print('¿perro es palíndromo?:', es_palindromo('perro')) 29 | -------------------------------------------------------------------------------- /parte11/ex11.10_division_recursiva.py: -------------------------------------------------------------------------------- 1 | # Ejercicio 11.10: Crear una función recursiva para dividir dos números. 2 | 3 | def dividir(dividendo, divisor): 4 | """ 5 | Calcula la división de dos números. 6 | 7 | Parameters: 8 | dividendo: Dividendo de la división. 9 | divisor: Divisor de la división. 10 | 11 | Returns: 12 | División entre dividendo y divisor. 13 | """ 14 | if divisor == 0: 15 | raise ZeroDivisionError('El divisor no puede ser cero (0).') 16 | elif dividendo == divisor: 17 | return 1 18 | elif dividendo < divisor: 19 | return 0 20 | else: 21 | return 1 + dividir(dividendo - divisor, divisor) 22 | 23 | 24 | print('{}/{} = {}'.format(5, 2, dividir(5, 2))) 25 | print('{}/{} = {}'.format(1, 2, dividir(1, 2))) 26 | 27 | try: 28 | print('{}/{} = {}'.format(1, 0, dividir(1, 0))) 29 | except ZeroDivisionError as e: 30 | print('ERROR:', e) 31 | -------------------------------------------------------------------------------- /parte12/12.1_programa_python.py: -------------------------------------------------------------------------------- 1 | # Parte 12 - Programa Python: 2 | 3 | def saludar(mensaje): 4 | print(mensaje) 5 | 6 | class Persona: 7 | def __init__(self, documento, nombre): 8 | self.documento = documento 9 | self.nombre = nombre 10 | 11 | edward = Persona(123456789, 'Edward Ortiz') 12 | 13 | saludo = f'Hola, mi nombre es {edward.nombre}.' 14 | 15 | saludar(saludo) 16 | -------------------------------------------------------------------------------- /parte12/12.3_uso_programa_python.py: -------------------------------------------------------------------------------- 1 | import parte12.demo_122_programa_python_punto_entrada as demo 2 | 3 | def main(): 4 | demo.main() 5 | 6 | if __name__ == '__main__': 7 | main() 8 | -------------------------------------------------------------------------------- /parte12/demo_122_programa_python_punto_entrada.py: -------------------------------------------------------------------------------- 1 | # Programa Python con punto de entrada: 2 | 3 | def saludar(mensaje): 4 | print(mensaje) 5 | 6 | class Persona: 7 | def __init__(self, documento, nombre): 8 | self.documento = documento 9 | self.nombre = nombre 10 | 11 | def main(): 12 | edward = Persona(123456789, 'Edward Ortiz') 13 | 14 | saludo = f'Hola, mi nombre es {edward.nombre}.' 15 | 16 | saludar(saludo) 17 | 18 | if __name__ == '__main__': 19 | main() 20 | -------------------------------------------------------------------------------- /parte12/proyecto/calculadora/__init__.py: -------------------------------------------------------------------------------- 1 | # Este archivo sirve para inicializar otros módulos. 2 | # Cada vez que se cree un módulo se define este archivo por convención. 3 | # De forma automática se realiza su invocación cada vez que se ejecute el proyecto. -------------------------------------------------------------------------------- /parte12/proyecto/calculadora/funciones_aritmeticas.py: -------------------------------------------------------------------------------- 1 | def sumar(a, b): 2 | """ 3 | Suma dos números. 4 | 5 | Parameters: 6 | a: Primer número a sumar. 7 | b: Segundo número a sumar. 8 | 9 | Returns: 10 | Suma de los dos números. 11 | """ 12 | return a + b 13 | 14 | def restar(a, b): 15 | """ 16 | Resta dos números. 17 | 18 | Parameters: 19 | a: Primer número a restar. 20 | b: Segundo número a restar. 21 | 22 | Returns: 23 | Resta de los dos números. 24 | """ 25 | return a - b 26 | 27 | def multiplicar(a, b): 28 | """ 29 | Multiplica dos números. 30 | 31 | Parameters: 32 | a: Primer número a multiplicar. 33 | b: Segundo número a multiplicar. 34 | 35 | Returns: 36 | Multiplica de los dos números. 37 | """ 38 | return a * b 39 | 40 | def dividir(a, b): 41 | """ 42 | Divide dos números. 43 | 44 | Parameters: 45 | a: Primer número a dividir (dividendo). 46 | b: Segundo número a dividir (divisor). 47 | 48 | Returns: 49 | Divide de los dos números. 50 | """ 51 | if b != 0: 52 | return a / b 53 | 54 | raise ZeroDivisionError('Está intentando dividir entre cero.') 55 | -------------------------------------------------------------------------------- /parte12/proyecto/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='calculadora', version='1.0.0', packages=['calculadora'], 4 | entry_points= { 5 | 'console_scripts': ['calculadora = calculadora.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte13/proyecto0/inventario/__init__.py: -------------------------------------------------------------------------------- 1 | # Incorporación o inclusión de otros módulos. -------------------------------------------------------------------------------- /parte13/proyecto0/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='inventario', version='1.0.0', packages=['inventario'], 4 | entry_points= { 5 | 'console_scripts': ['inventario = inventario.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte14/14.1_introduccion_manipulacion_archivos.py: -------------------------------------------------------------------------------- 1 | def main(): 2 | # Introducción a la Manipulación de Archivos de Texto 3 | print('Introducción a la Manipulación de Archivos de Texto') 4 | 5 | print() 6 | 7 | # Apertura de un archivo de texto: 8 | print('Apertura de un archivo de texto:') 9 | 10 | nombre_archivo = 'parte14/lenguajes.txt' 11 | 12 | archivo = open(nombre_archivo, 'r') 13 | 14 | for l in archivo.readlines(): 15 | print(l, end='') 16 | 17 | archivo.close() 18 | 19 | print() 20 | 21 | # Apertura de un archivo con un manejador de contexto: 22 | print('Apertura de un archivo con un manejador de contexto:') 23 | 24 | nombre_archivo = 'parte14/lenguajes.txt' 25 | 26 | with open(nombre_archivo, 'r') as f: 27 | for l in f.readlines(): 28 | print(l, end='') 29 | 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /parte14/14.2_creacion_archivo_texto_plano.py: -------------------------------------------------------------------------------- 1 | def main(): 2 | # Creación de un archivo de texto plano: 3 | 4 | nombre_archivo = 'parte14/paises.txt' 5 | 6 | with open(nombre_archivo, 'w', encoding='utf-8') as f: 7 | f.write('Colombia') 8 | f.write('\n') 9 | f.write('Ecuador') 10 | f.write('\n') 11 | f.write('Argentina') 12 | f.write('\n') 13 | f.write('Alemania') 14 | f.write('\n') 15 | f.write('Perú') 16 | f.write('\n') 17 | f.write('Italia') 18 | f.write('\n') 19 | f.write('Rusia') 20 | 21 | 22 | if __name__ == "__main__": 23 | main() 24 | -------------------------------------------------------------------------------- /parte14/14.3_adicion_contenido_archivo.py: -------------------------------------------------------------------------------- 1 | def main(): 2 | # Adicionar/agregar contenido a un archivo de texto plano: 3 | print('Adicionar/agregar contenido a un archivo de texto plano:') 4 | 5 | nombre_archivo = 'parte14/paises.txt' 6 | 7 | with open(nombre_archivo, 'a+', encoding='utf-8') as f: 8 | f.write('\n') 9 | f.write('Egipto') 10 | f.write('\n') 11 | f.write('Japón') 12 | f.write('\n') 13 | f.write('Bolivia') 14 | 15 | print('El programa ha finalizado.') 16 | 17 | if __name__ == "__main__": 18 | main() 19 | -------------------------------------------------------------------------------- /parte14/14.4_intro_archivos_binarios.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | def main(): 4 | # Creación de un archivo binario: 5 | print('Creación de un archivo binario:') 6 | 7 | nombre_archivo = 'parte14/numeros.bin' 8 | 9 | archivo = open(nombre_archivo, 'wb') 10 | 11 | numeros = [2, 3, 5, 7, 11] 12 | 13 | archivo.write(bytearray(numeros)) 14 | 15 | archivo.close() 16 | 17 | print('El programa ha terminado.') 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /parte14/14.5_lectura_archivo_binario.py: -------------------------------------------------------------------------------- 1 | def main(): 2 | # Lectura del contenido de un archivo binario: 3 | print('Lectura del contenido de un archivo binario:') 4 | 5 | nombre_archivo = 'parte14/numeros.bin' 6 | 7 | archivo = open(nombre_archivo, 'rb') 8 | 9 | numeros = list(archivo.read()) 10 | 11 | archivo.close() 12 | 13 | print() 14 | 15 | print(numeros) 16 | 17 | print('El programa ha terminado.') 18 | 19 | if __name__ == "__main__": 20 | main() 21 | -------------------------------------------------------------------------------- /parte14/14.6_archivos_binarios_with.py: -------------------------------------------------------------------------------- 1 | def main(): 2 | nombre_archivo = 'parte14/numeros.bin' 3 | 4 | print('Se está creando un archivo binario...') 5 | with open(nombre_archivo, 'wb') as f: 6 | 7 | numeros = [2, 3, 5, 7, 11] 8 | f.write(bytearray(numeros)) 9 | 10 | print() 11 | 12 | print('Este es el contenido del archivo binario `numeros.bin`:') 13 | 14 | with open(nombre_archivo, 'rb') as f: 15 | 16 | numeros = list(f.read()) 17 | 18 | print() 19 | 20 | print(numeros) 21 | 22 | print() 23 | 24 | print('El programa ha terminado.') 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /parte14/14.7_modulo_pickle.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | 3 | def main(): 4 | # Uso del módulo `pickle` para serializar y des-serializar objetos Python: 5 | print('Uso del módulo `pickle` para serializar y des-serializar objetos Python:') 6 | 7 | paises_capitales = {'Colombia': 'Bogotá', 'Ecuador': 'Quito', 'Argentina': 'Buenos'} 8 | 9 | nombre_archivo = 'parte14/paises_capitales.pickle' 10 | 11 | with open(nombre_archivo, 'wb') as f: 12 | pickle.dump(paises_capitales, f) 13 | 14 | print() 15 | 16 | print('Lectura del contenido de un archivo pickle:') 17 | 18 | with open(nombre_archivo, 'rb') as f: 19 | paises_capitales_recuperados = pickle.load(f) 20 | 21 | print('Tipo de dato de la variable `paises_capitales_recuperados`:', type(paises_capitales_recuperados)) 22 | print('El contenido de la variable `paises_capitales_recuperados`:') 23 | print(paises_capitales_recuperados) 24 | 25 | print() 26 | 27 | print('El programa ha terminado.') 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /parte14/14.9_ejercicio.txt: -------------------------------------------------------------------------------- 1 | Parte 14 - Ejercicio 2 | 3 | En el Proyecto 0 se construyó un sistema de gestión de inventario de dispositivos electrónicos para la empresa Dispositivos S.a.s. 4 | 5 | En esta oportunidad han llegado nuevos requerimientos funcionales: 6 | 7 | 1. Persistir los datos de los productos al finalizar la aplicación. 8 | 2. Facilitar al usuario la opción de cargar los datos al inicio de la aplicación. 9 | 10 | Nota 1: Es importante aclarar que el archivo de productos debe existir para visualizar en pantalla el segundo requerimiento. 11 | 12 | Nota 2: No se debe modificar los archivos del Proyecto 0. Se debe hacer una copia de los archivos integrales. 13 | 14 | Solución: 15 | 16 | Se usará el módulo `pickle` para realizar la persistencia de los datos. El módulo `pickle` serializa objetos Python (cualquier tipo de objeto). 17 | 18 | inventario.pickle 19 | -------------------------------------------------------------------------------- /parte14/archivo1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte14/archivo1.txt -------------------------------------------------------------------------------- /parte14/lenguajes.txt: -------------------------------------------------------------------------------- 1 | Python 2 | Java 3 | C# 4 | C 5 | JavaScript 6 | Perl 7 | PHP 8 | C++ 9 | Go 10 | Kotlin -------------------------------------------------------------------------------- /parte14/numeros.bin: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /parte14/paises.txt: -------------------------------------------------------------------------------- 1 | Colombia 2 | Ecuador 3 | Argentina 4 | Alemania 5 | Perú 6 | Italia 7 | Rusia 8 | Egipto 9 | Japón 10 | Bolivia -------------------------------------------------------------------------------- /parte14/paises_capitales.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte14/paises_capitales.pickle -------------------------------------------------------------------------------- /parte14/proyecto0/inventario/__init__.py: -------------------------------------------------------------------------------- 1 | # Incorporación o inclusión de otros módulos. -------------------------------------------------------------------------------- /parte14/proyecto0/inventario/inventario.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte14/proyecto0/inventario/inventario.pickle -------------------------------------------------------------------------------- /parte14/proyecto0/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='inventario', version='1.0.0', packages=['inventario'], 4 | entry_points= { 5 | 'console_scripts': ['inventario = inventario.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte15/inventario/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/__init__.py -------------------------------------------------------------------------------- /parte15/inventario/__main__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/__main__.py -------------------------------------------------------------------------------- /parte15/inventario/base_datos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/base_datos/__init__.py -------------------------------------------------------------------------------- /parte15/inventario/base_datos/conexion.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/base_datos/conexion.py -------------------------------------------------------------------------------- /parte15/inventario/gui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/gui/__init__.py -------------------------------------------------------------------------------- /parte15/inventario/gui/dialogos.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/gui/dialogos.py -------------------------------------------------------------------------------- /parte15/inventario/gui/formularios.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/gui/formularios.py -------------------------------------------------------------------------------- /parte15/inventario/gui/menus.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/gui/menus.py -------------------------------------------------------------------------------- /parte15/inventario/gui/ventana.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/gui/ventana.py -------------------------------------------------------------------------------- /parte15/inventario/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/modelos/__init__.py -------------------------------------------------------------------------------- /parte15/inventario/modelos/cliente.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/modelos/cliente.py -------------------------------------------------------------------------------- /parte15/inventario/modelos/factura.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/modelos/factura.py -------------------------------------------------------------------------------- /parte15/inventario/modelos/producto.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/modelos/producto.py -------------------------------------------------------------------------------- /parte15/inventario/modelos/proveedor.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte15/inventario/modelos/proveedor.py -------------------------------------------------------------------------------- /parte16/animales/main.py: -------------------------------------------------------------------------------- 1 | from modelos.pato import Pato 2 | from modelos.gato import Gato 3 | from modelos.perro import Perro 4 | 5 | def main(): 6 | animales = [] 7 | 8 | cua = Pato('Platy', 2, 'Anas platyrhynchos domesticus', 'Verde') 9 | 10 | charlie = Gato('Charlie', 1, 'Felis catus', True) 11 | 12 | mateo = Perro('Mateo', 2, 'Canis lupus familiaris', 'Golden Retriever') 13 | 14 | animales.append(cua) 15 | animales.append(charlie) 16 | animales.append(mateo) 17 | 18 | print('Nombres de los animales:') 19 | for a in animales: 20 | print('Nombre del animal:', a.nombre) 21 | 22 | print() 23 | 24 | print('El zootecnista les dice a todos los animales que hablen ahora:') 25 | 26 | for a in animales: 27 | a.hablar() 28 | 29 | if __name__ == '__main__': 30 | main() 31 | -------------------------------------------------------------------------------- /parte16/animales/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte16/animales/modelos/__init__.py -------------------------------------------------------------------------------- /parte16/animales/modelos/animal.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | 3 | class Animal(ABC): 4 | def __init__(self, nombre, edad, nombre_cientifico): 5 | self.nombre = nombre 6 | self.edad = edad 7 | self.nombre_cientifico = nombre_cientifico 8 | 9 | def comer(self): 10 | print('El animal está comiendo...') 11 | 12 | def moverse(self): 13 | print('El animal se está moviendo...') 14 | 15 | @abstractmethod 16 | def hablar(self): 17 | pass -------------------------------------------------------------------------------- /parte16/animales/modelos/gato.py: -------------------------------------------------------------------------------- 1 | from . animal import Animal 2 | 3 | class Gato(Animal): 4 | def __init__(self, nombre, edad, nombre_cientifico, domestico): 5 | super().__init__(nombre, edad, nombre_cientifico) 6 | 7 | self.domestico = domestico 8 | 9 | def ronronear(self): 10 | print('El gato está ronroneando...') 11 | 12 | def hablar(self): 13 | print('¡Miau!') 14 | -------------------------------------------------------------------------------- /parte16/animales/modelos/pato.py: -------------------------------------------------------------------------------- 1 | from .animal import Animal 2 | 3 | class Pato(Animal): 4 | def __init__(self, nombre, edad, nombre_cientifico, color): 5 | super().__init__(nombre, edad, nombre_cientifico) 6 | 7 | self.color = color 8 | 9 | def volar(self): 10 | print('El pato está volando...') 11 | 12 | def hablar(self): 13 | print('¡Cuá cuá!') 14 | -------------------------------------------------------------------------------- /parte16/animales/modelos/perro.py: -------------------------------------------------------------------------------- 1 | from . animal import Animal 2 | 3 | class Perro(Animal): 4 | def __init__(self, nombre, edad, nombre_cientifico, raza): 5 | super().__init__(nombre, edad, nombre_cientifico) 6 | 7 | self.raza = raza 8 | 9 | def jugar(self): 10 | print('El perro está jugando.') 11 | 12 | def hablar(self): 13 | print('¡Guau!') 14 | -------------------------------------------------------------------------------- /parte16/carros/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte16/carros/modelos/__init__.py -------------------------------------------------------------------------------- /parte16/carros/modelos/camion.py: -------------------------------------------------------------------------------- 1 | from . carro import Carro 2 | 3 | class Camion(Carro): 4 | def __init__(self, placa, marca, modelo, pais_procedencia, capacidad_carga): 5 | super().__init__(placa, marca, modelo, pais_procedencia) 6 | 7 | self.capacidad_carga = capacidad_carga 8 | 9 | def cargar_mercancia(self): 10 | print('La mercancía se está cargando...') 11 | 12 | def descargar_mercancia(self): 13 | print('La mercancía se está descargando...') -------------------------------------------------------------------------------- /parte16/carros/modelos/carro.py: -------------------------------------------------------------------------------- 1 | class Carro: 2 | def __init__(self, placa, marca, modelo, pais_procedencia): 3 | self.placa = placa 4 | self.marca = marca 5 | self.modelo = modelo 6 | self.pais_procedencia = pais_procedencia 7 | self.estado = False 8 | 9 | def encender(self): 10 | if not self.estado: 11 | self.estado = True 12 | 13 | def apagar(self): 14 | if self.estado: 15 | self.estado = False 16 | 17 | def acelerar(self): 18 | if self.estado: 19 | print('El carro ha acelerado') 20 | 21 | def frenar(self): 22 | if self.estado: 23 | print('El carro ha frenado') 24 | -------------------------------------------------------------------------------- /parte16/carros/modelos/deportivo.py: -------------------------------------------------------------------------------- 1 | from . carro import Carro 2 | 3 | class Deportivo(Carro): 4 | def __init__(self, placa, marca, modelo, pais_procedencia, marca_rines, tipo): 5 | super().__init__(placa, marca, modelo, pais_procedencia) 6 | 7 | self.marca_rines = marca_rines 8 | self.tipo = tipo 9 | 10 | def abrir_puertas(self): 11 | print('Las puertas se están abriendo...') 12 | 13 | def cerrar_puertas(self): 14 | print('Las puertas se están cerrando...') 15 | -------------------------------------------------------------------------------- /parte16/carros/modelos/formula1.py: -------------------------------------------------------------------------------- 1 | from . carro import Carro 2 | 3 | class Formula1(Carro): 4 | def __init__(self, placa, marca, modelo, pais_procedencia, peso): 5 | super().__init__(placa, marca, modelo, pais_procedencia) 6 | 7 | self.peso = peso 8 | 9 | def competir(self): 10 | print('El auto ingresa a la pista de carrera...') -------------------------------------------------------------------------------- /parte16/carros/modelos/volqueta.py: -------------------------------------------------------------------------------- 1 | from . carro import Carro 2 | 3 | class Volqueta(Carro): 4 | def __init__(self, placa, marca, modelo, pais_procedencia, capacidad_carga, costo_servicio): 5 | super().__init__(placa, marca, modelo, pais_procedencia) 6 | 7 | self.capacidad_carga = capacidad_carga 8 | self.costo_servicio = costo_servicio 9 | 10 | def cargar_material(self): 11 | print('Se está cargando el material en la volqueta...') 12 | 13 | def descargar_material(self): 14 | print('Se está descargando el material desde la volqueta...') 15 | -------------------------------------------------------------------------------- /parte16/ejercicio1.txt: -------------------------------------------------------------------------------- 1 | Parte 16 - Ejercicio 2 | 3 | En el Proyecto 0 se construyó un sistema de gestión de inventario de dispositivos electrónicos para la empresa Dispositivos S.a.s. 4 | 5 | Cambios a realizar sobre el Proyecto 0: 6 | 7 | - Aplicar los conceptos de programación orientada objetos 8 | - Crear un diagrama de clases con UML. 9 | - Crear archivos para cada clase identificada 10 | - Adaptar los archivos que sean necesarios. 11 | -------------------------------------------------------------------------------- /parte16/empleados/main.py: -------------------------------------------------------------------------------- 1 | from modelos.empleado_comision import EmpleadoComision 2 | from modelos.empleado_horas import EmpleadoHoras 3 | from modelos.empleado_nomina import EmpleadoNomina 4 | 5 | def main(): 6 | empleados = [] 7 | 8 | jorge = EmpleadoComision('123', 'Jorge Pérez', 'jorge@mail.co', 'Ventas', 0.30, 10000) 9 | 10 | viviana = EmpleadoHoras('987', 'Viviana García', 'viviana@mail.co', 'Diseño Gráfico', 80, 100) 11 | 12 | patricia = EmpleadoNomina('456', 'Patricia Toledo', 'patricia@mail.co', 'Finanzas', 0.10) 13 | 14 | empleados.append(jorge) 15 | empleados.append(viviana) 16 | empleados.append(patricia) 17 | 18 | for e in empleados: 19 | print(e) 20 | print(f'Salario: {e.calcular_salario()}') 21 | 22 | print() 23 | 24 | if __name__ == '__main__': 25 | main() 26 | -------------------------------------------------------------------------------- /parte16/empleados/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte16/empleados/modelos/__init__.py -------------------------------------------------------------------------------- /parte16/empleados/modelos/empleado.py: -------------------------------------------------------------------------------- 1 | from abc import ABC 2 | 3 | class Empleado(ABC): 4 | SALARIO_BASE = 1000 5 | 6 | def __init__(self, documento, nombre_completo, correo_electronico, especialidad): 7 | self.documento = documento 8 | self.nombre_completo = nombre_completo 9 | self.correo_electronico = correo_electronico 10 | self.especialidad = especialidad 11 | 12 | def calcular_salario(self): 13 | total = Empleado.SALARIO_BASE * 1.10 14 | 15 | return total 16 | 17 | def __str__(self): 18 | return f'Documento: {self.documento} - Nombre completo: {self.nombre_completo} - Correo-e: {self.correo_electronico} - Especialidad: {self.especialidad}.' -------------------------------------------------------------------------------- /parte16/empleados/modelos/empleado_comision.py: -------------------------------------------------------------------------------- 1 | from .empleado import Empleado 2 | 3 | class EmpleadoComision(Empleado): 4 | def __init__(self, documento, nombre_completo, correo_electronico, especialidad, porcentaje_comision, monto): 5 | super().__init__(documento, nombre_completo, correo_electronico, especialidad) 6 | 7 | self.porcentaje_comision = porcentaje_comision 8 | self.monto = monto 9 | 10 | def calcular_salario(self): 11 | total = super().calcular_salario() + self.monto * self.porcentaje_comision 12 | 13 | return total 14 | -------------------------------------------------------------------------------- /parte16/empleados/modelos/empleado_horas.py: -------------------------------------------------------------------------------- 1 | from .empleado import Empleado 2 | 3 | class EmpleadoHoras(Empleado): 4 | def __init__(self, documento, nombre_completo, correo_electronico, especialidad, numero_horas, valor_hora): 5 | super().__init__(documento, nombre_completo, correo_electronico, especialidad) 6 | 7 | self.numero_horas = numero_horas 8 | self.valor_hora = valor_hora 9 | 10 | def calcular_salario(self): 11 | total = super().calcular_salario() + self.numero_horas * self.valor_hora 12 | 13 | return total 14 | -------------------------------------------------------------------------------- /parte16/empleados/modelos/empleado_nomina.py: -------------------------------------------------------------------------------- 1 | from .empleado import Empleado 2 | 3 | class EmpleadoNomina(Empleado): 4 | SALARIO = 2000 5 | 6 | def __init__(self, documento, nombre_completo, correo_electronico, especialidad, porcentaje_prestaciones): 7 | super().__init__(documento, nombre_completo, correo_electronico, especialidad) 8 | 9 | self.porcentaje_prestaciones = porcentaje_prestaciones 10 | 11 | def calcular_salario(self): 12 | total = super().calcular_salario() + EmpleadoNomina.SALARIO * (1 - self.porcentaje_prestaciones) 13 | 14 | return total 15 | -------------------------------------------------------------------------------- /parte16/figuras/main.py: -------------------------------------------------------------------------------- 1 | from modelos.rectangulo import Rectangulo 2 | from modelos.circulo import Circulo 3 | from modelos.triangulo import Triangulo 4 | 5 | def main(): 6 | # Prueba de ejecución sobre la jerarquía de herencia de figuras - polimorfismo: 7 | print('Prueba de ejecución sobre la jerarquía de herencia de figuras - polimorfismo:') 8 | 9 | figuras = [] 10 | 11 | rectangulo_rojo = Rectangulo('Rojo', 'Negro', 10, 5) 12 | 13 | circulo_verde = Circulo('Verde', 'Negro', 5) 14 | 15 | triangulo_negro = Triangulo('Negro', 'Gris', 7, 10) 16 | 17 | figuras.append(rectangulo_rojo) 18 | figuras.append(circulo_verde) 19 | figuras.append(triangulo_negro) 20 | 21 | print() 22 | 23 | print('El área de todas las figuras:') 24 | for f in figuras: 25 | f.dibujar() 26 | 27 | area = f.area() 28 | print(f'El área es igual a {area} u^2') 29 | 30 | print() 31 | 32 | print() 33 | 34 | # Demostración de sobreescritura de métodos: 35 | print('Demostración de sobreescritura de métodos:') 36 | 37 | print(rectangulo_rojo) 38 | 39 | print() 40 | 41 | print(circulo_verde) 42 | 43 | print() 44 | 45 | print(triangulo_negro) 46 | 47 | if __name__ == '__main__': 48 | main() 49 | -------------------------------------------------------------------------------- /parte16/figuras/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte16/figuras/modelos/__init__.py -------------------------------------------------------------------------------- /parte16/figuras/modelos/circulo.py: -------------------------------------------------------------------------------- 1 | from .figura import Figura 2 | from math import pi 3 | 4 | class Circulo(Figura): 5 | def __init__(self, color_fondo, color_borde, radio): 6 | super().__init__(color_fondo, color_borde) 7 | 8 | self.radio = radio 9 | 10 | def dibujar(self): 11 | print(f'Se está dibujando el círculo que tiene radio {self.radio}.') 12 | 13 | def area(self): 14 | resultado = pi * self.radio ** 2 15 | return resultado 16 | 17 | def __str__(self): 18 | return f'Círculo -- {super().__str__()} - Radio: {self.radio}' -------------------------------------------------------------------------------- /parte16/figuras/modelos/figura.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | 3 | class Figura(ABC): 4 | def __init__(self, color_fondo, color_borde): 5 | self.color_fondo = color_fondo 6 | self.color_borde = color_borde 7 | 8 | @abstractmethod 9 | def dibujar(self): 10 | pass 11 | 12 | @abstractmethod 13 | def area(self): 14 | pass 15 | 16 | def __str__(self): 17 | return f'Color fondo: {self.color_fondo} - Color borde: {self.color_borde}' 18 | -------------------------------------------------------------------------------- /parte16/figuras/modelos/rectangulo.py: -------------------------------------------------------------------------------- 1 | from .figura import Figura 2 | 3 | class Rectangulo(Figura): 4 | def __init__(self, color_fondo, color_borde, ancho, alto): 5 | super().__init__(color_fondo, color_borde) 6 | 7 | self.ancho = ancho 8 | self.alto = alto 9 | 10 | def dibujar(self): 11 | print(f'Se está dibujando el rectángulo con medidas ancho {self.ancho} y alto {self.alto}.') 12 | 13 | def area(self): 14 | resultado = self.ancho * self.alto 15 | 16 | return resultado 17 | 18 | def __str__(self): 19 | return f'Rectángulo -- {super().__str__()} - Ancho: {self.ancho} - Alto: {self.alto}' 20 | -------------------------------------------------------------------------------- /parte16/figuras/modelos/triangulo.py: -------------------------------------------------------------------------------- 1 | from .figura import Figura 2 | 3 | class Triangulo(Figura): 4 | def __init__(self, color_fondo, color_borde, base, altura): 5 | super().__init__(color_fondo, color_borde) 6 | 7 | self.base = base 8 | self.altura = altura 9 | 10 | def dibujar(self): 11 | print(f'Se está dibujando un triángulo con base {self.base} y altura {self.altura}.') 12 | 13 | def area(self): 14 | resultado = self.base * self.altura / 2 15 | return resultado 16 | 17 | def __str__(self): 18 | return f'Triángulo -- {super().__str__()} - Base: {self.base} - Altura: {self.altura}' 19 | -------------------------------------------------------------------------------- /parte16/proyecto0/inventario/__init__.py: -------------------------------------------------------------------------------- 1 | # Incorporación o inclusión de otros módulos. -------------------------------------------------------------------------------- /parte16/proyecto0/inventario/inventario.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte16/proyecto0/inventario/inventario.pickle -------------------------------------------------------------------------------- /parte16/proyecto0/inventario/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte16/proyecto0/inventario/modelos/__init__.py -------------------------------------------------------------------------------- /parte16/proyecto0/inventario/modelos/producto.py: -------------------------------------------------------------------------------- 1 | class Producto: 2 | def __init__(self, codigo, nombre, precio, cantidad, disponible): 3 | self.codigo = codigo 4 | self.nombre = nombre 5 | self.precio = precio 6 | self.cantidad = cantidad 7 | self.disponible = disponible 8 | -------------------------------------------------------------------------------- /parte16/proyecto0/inventario/modelos/venta.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | class Venta: 4 | def __init__(self, codigo_producto, cantidad, total_sin_iva): 5 | self.codigo_producto = codigo_producto 6 | self.fecha = datetime.now() 7 | self.cantidad = cantidad 8 | self.total_sin_iva = total_sin_iva 9 | -------------------------------------------------------------------------------- /parte16/proyecto0/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='inventario', version='1.0.0', packages=['inventario'], 4 | entry_points= { 5 | 'console_scripts': ['inventario = inventario.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte17/Parte17-Ejercicios.txt: -------------------------------------------------------------------------------- 1 | Parte 17 - Ejercicios 2 | 3 | Ejercicio 1. Crear una aplicación para dibujar diferentes tipos de figuras geométricas: círculo, rectángulo, y línea. 4 | 5 | Nota: Ver mockup acompañante. 6 | 7 | 8 | Ejercicio 2. En el Proyecto 0 se construyó un sistema de gestión de inventario de dispositivos electrónicos para la empresa Dispositivos S.a.s. 9 | 10 | Se requiere remodelar la aplicación basada en consola en una aplicación con interfaz gráfica de usuario. 11 | 12 | Se debe utilizar un enfoque basado en MDI (Multiple Document Interface). 13 | 14 | Nota: Ver demostraciones 18 y 74: 15 | 16 | - demo18_mdi.py 17 | - demo74_contenedor_ventanas.py 18 | -------------------------------------------------------------------------------- /parte17/ball.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/ball.jpg -------------------------------------------------------------------------------- /parte17/circuloIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/circuloIcon.ico -------------------------------------------------------------------------------- /parte17/datos.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/datos.db -------------------------------------------------------------------------------- /parte17/demo01_hola_pyqt5.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow 4 | 5 | class VentanaPrincipal(QMainWindow): 6 | def __init__(self): 7 | QMainWindow.__init__(self) 8 | 9 | self.setWindowTitle('¡Hola, PyQt5!') 10 | 11 | self.setFixedSize(500, 400) 12 | 13 | 14 | def main(): 15 | app = QApplication(sys.argv) 16 | 17 | ventana = VentanaPrincipal() 18 | ventana.show() 19 | 20 | sys.exit(app.exec_()) 21 | 22 | if __name__ == "__main__": 23 | main() 24 | -------------------------------------------------------------------------------- /parte17/demo02_qlabel.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel 4 | 5 | class VentanaPrincipal(QMainWindow): 6 | def __init__(self): 7 | QMainWindow.__init__(self) 8 | 9 | self.initUi() 10 | 11 | def initUi(self): 12 | self.setWindowTitle('Demostración del Componente QLabel') 13 | 14 | self.setFixedSize(500, 400) 15 | 16 | self.lbl_mensaje = QLabel('¡PyQt5 es tremendo!', self) 17 | self.lbl_mensaje.move(100, 50) 18 | 19 | def main(): 20 | app = QApplication(sys.argv) 21 | ventana = VentanaPrincipal() 22 | ventana.show() 23 | 24 | sys.exit(app.exec_()) 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /parte17/demo03_qpushbutton.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton 4 | 5 | class VentanaPrincipal(QMainWindow): 6 | def __init__(self): 7 | QMainWindow.__init__(self) 8 | 9 | self.initUi() 10 | 11 | def initUi(self): 12 | self.setWindowTitle('Demostración de QPushButton') 13 | self.setFixedSize(500, 400) 14 | 15 | self.btn_mostrar_mensaje = QPushButton('Mostrar mensaje', self) 16 | self.btn_mostrar_mensaje.move(100, 50) 17 | self.btn_mostrar_mensaje.clicked.connect(self.mostrar_mensaje) 18 | 19 | def mostrar_mensaje(self): 20 | print('El usuario ha presionado el botón `Mostrar mensaje`.') 21 | 22 | 23 | def main(): 24 | app = QApplication(sys.argv) 25 | ventana = VentanaPrincipal() 26 | ventana.show() 27 | 28 | sys.exit(app.exec_()) 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /parte17/demo04_qmessagebox.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButton 4 | 5 | class VentanaPrincipal(QMainWindow): 6 | def __init__(self): 7 | QMainWindow.__init__(self) 8 | 9 | self.initUi() 10 | 11 | def initUi(self): 12 | self.setWindowTitle('Demostración de QMessageBox') 13 | self.setFixedSize(500, 400) 14 | 15 | self.btn_mostrar_mensaje = QPushButton('Mostrar mensaje', self) 16 | self.btn_mostrar_mensaje.move(100, 50) 17 | self.btn_mostrar_mensaje.clicked.connect(self.mostrar_mensaje) 18 | 19 | def mostrar_mensaje(self): 20 | mensaje = QMessageBox() 21 | mensaje.setIcon(QMessageBox.Information) 22 | mensaje.setText('Ha hecho click sobre el botón Mostrar mensaje') 23 | mensaje.setWindowTitle('Información') 24 | 25 | mensaje.exec_() 26 | 27 | 28 | def main(): 29 | app = QApplication(sys.argv) 30 | ventana = VentanaPrincipal() 31 | ventana.show() 32 | 33 | sys.exit(app.exec_()) 34 | 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /parte17/demo05_qlineedit.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit 4 | 5 | class VentanaPrincipal(QMainWindow): 6 | def __init__(self): 7 | QMainWindow.__init__(self) 8 | 9 | self.initUi() 10 | 11 | def initUi(self): 12 | self.setWindowTitle("Demostración de QLineEdit") 13 | self.setFixedSize(500, 400) 14 | 15 | self.txt_mensaje = QLineEdit(self) 16 | self.txt_mensaje.move(100, 50) 17 | 18 | 19 | def main(): 20 | app = QApplication(sys.argv) 21 | ventana = VentanaPrincipal() 22 | ventana.show() 23 | 24 | sys.exit(app.exec_()) 25 | 26 | 27 | if __name__ == "__main__": 28 | main() 29 | -------------------------------------------------------------------------------- /parte17/demo15_imagen.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow 4 | from PyQt5.QtGui import QPixmap 5 | 6 | class ImagenVentana(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.setWindowTitle('Logo PyQt') 14 | 15 | lbl_imagen = QLabel(self) 16 | imagen = QPixmap('parte17/pyqt_logo.png') 17 | lbl_imagen.setPixmap(imagen) 18 | lbl_imagen.setFixedWidth(imagen.width()) 19 | lbl_imagen.setFixedHeight(imagen.height()) 20 | self.resize(imagen.width(), imagen.height()) 21 | 22 | def main(): 23 | app = QApplication(sys.argv) 24 | ventana = ImagenVentana() 25 | ventana.show() 26 | 27 | sys.exit(app.exec_()) 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /parte17/demo25_qcalendarwidget.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QCalendarWidget, QLabel, QMainWindow 4 | from PyQt5.QtCore import QDate 5 | 6 | class SelectorFechaVentana(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.setWindowTitle('Selector Fecha') 14 | self.setFixedSize(300, 300) 15 | 16 | self.calendario = QCalendarWidget(self) 17 | self.calendario.setGridVisible(True) 18 | self.calendario.move(30, 20) 19 | self.calendario.setFixedWidth(200) 20 | self.calendario.setFixedHeight(200) 21 | self.calendario.clicked[QDate].connect(self.mostrar_fecha_seleccionada) 22 | 23 | self.lbl_fecha_seleccionada = QLabel('', self) 24 | self.lbl_fecha_seleccionada.move(30, 220) 25 | self.lbl_fecha_seleccionada.setFixedWidth(250) 26 | 27 | def mostrar_fecha_seleccionada(self, fecha): 28 | self.lbl_fecha_seleccionada.setText(fecha.toString()) 29 | 30 | 31 | def main(): 32 | app = QApplication(sys.argv) 33 | ventana = SelectorFechaVentana() 34 | ventana.show() 35 | 36 | sys.exit(app.exec_()) 37 | 38 | if __name__ == "__main__": 39 | main() 40 | -------------------------------------------------------------------------------- /parte17/demo26_qwidget.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QLabel, QLineEdit, QPushButton, QWidget 4 | 5 | class InterfazGrafica(QWidget): 6 | 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.setWindowTitle('Interfaz Gráfica con QWidget') 14 | self.setFixedSize(400, 300) 15 | 16 | lbl_mensaje = QLabel('¡PyQt es genial!', self) 17 | lbl_mensaje.move(30, 30) 18 | lbl_mensaje.setFixedWidth(200) 19 | 20 | btn_cambiar_texto = QPushButton('Cambiar texto', self) 21 | btn_cambiar_texto.move(30, 90) 22 | btn_cambiar_texto.setFixedWidth(200) 23 | btn_cambiar_texto.clicked.connect(lambda _: lbl_mensaje.setText('¡Python es tremendo!')) 24 | 25 | txt_nombre = QLineEdit(self) 26 | txt_nombre.move(30, 120) 27 | txt_nombre.setFixedWidth(200) 28 | 29 | def main(): 30 | app = QApplication(sys.argv) 31 | widget = InterfazGrafica() 32 | widget.show() 33 | 34 | sys.exit(app.exec_()) 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /parte17/demo36_qtreeview.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QFileSystemModel, QTreeView, QVBoxLayout, QWidget 4 | 5 | class ExploradorArchivos(QWidget): 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializarGui() 10 | 11 | def inicializarGui(self): 12 | self.setWindowTitle('Explorador Archivos') 13 | self.setFixedSize(600, 600) 14 | 15 | self.modelo = QFileSystemModel() 16 | self.modelo.setRootPath('') 17 | 18 | self.explorador = QTreeView() 19 | self.explorador.setModel(self.modelo) 20 | 21 | self.explorador.setAnimated(False) 22 | self.explorador.setIndentation(20) 23 | self.explorador.setSortingEnabled(True) 24 | 25 | self.layout = QVBoxLayout() 26 | self.layout.addWidget(self.explorador) 27 | 28 | self.setLayout(self.layout) 29 | 30 | self.show() 31 | 32 | def main(): 33 | app = QApplication(sys.argv) 34 | dialogo = ExploradorArchivos() 35 | 36 | sys.exit(app.exec_()) 37 | 38 | if __name__ == "__main__": 39 | main() 40 | -------------------------------------------------------------------------------- /parte17/demo38_saludo_qt_designer.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 422 10 | 248 11 | 12 | 13 | 14 | Saludo 15 | 16 | 17 | 18 | 19 | 20 | 180 21 | 90 22 | 75 23 | 23 24 | 25 | 26 | 27 | Saluda al usuario 28 | 29 | 30 | Saludar 31 | 32 | 33 | 34 | 35 | 36 | 37 | 0 38 | 0 39 | 422 40 | 21 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /parte17/demo39_lanzar_archivo_gui_ui.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QPushButton 4 | from PyQt5 import uic 5 | 6 | class Aplicacion(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | uic.loadUi('parte17/demo38_saludo_qt_designer.ui', self) 14 | 15 | self.btn_saludar = self.findChild(QPushButton, 'btn_saludar') 16 | self.btn_saludar.clicked.connect(self.saludar) 17 | 18 | self.show() 19 | 20 | def saludar(self): 21 | mensaje = QMessageBox(self) 22 | mensaje.setWindowTitle('Mensaje') 23 | mensaje.setIcon(QMessageBox.Information) 24 | mensaje.setText('¡Hola usuario!') 25 | mensaje.exec_() 26 | 27 | def main(): 28 | app = QApplication(sys.argv) 29 | ventana = Aplicacion() 30 | sys.exit(app.exec_()) 31 | 32 | if __name__ == "__main__": 33 | main() 34 | -------------------------------------------------------------------------------- /parte17/demo41_aplicacion.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox 4 | from demo40_traduccion_gui import Ui_MainWindow 5 | 6 | class Aplicacion(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.ui = Ui_MainWindow() 14 | self.ui.setupUi(self) 15 | 16 | self.ui.btn_saludar.clicked.connect(self.saludar) 17 | 18 | def saludar(self): 19 | mensaje = QMessageBox(self) 20 | mensaje.setWindowTitle('Mensaje') 21 | mensaje.setIcon(QMessageBox.Information) 22 | mensaje.setText('¡Hola, usuario!') 23 | 24 | mensaje.exec_() 25 | 26 | def main(): 27 | app = QApplication(sys.argv) 28 | ventana = Aplicacion() 29 | ventana.show() 30 | 31 | sys.exit(app.exec_()) 32 | 33 | if __name__ == "__main__": 34 | main() 35 | -------------------------------------------------------------------------------- /parte17/demo44_aplicacion_calculadora.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow 4 | from demo44_calculadora_basica import Ui_CalculadoraBasicaVentana 5 | 6 | class AplicacionVentana(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.ui = Ui_CalculadoraBasicaVentana() 14 | self.ui.setupUi(self) 15 | 16 | self.ui.btn_sumar.clicked.connect(self.sumar) 17 | 18 | self.show() 19 | 20 | def sumar(self): 21 | numero_1 = float(self.ui.txt_numero_1.text()) 22 | numero_2 = float(self.ui.txt_numero_2.text()) 23 | 24 | suma = numero_1 + numero_2 25 | 26 | self.ui.txt_resultado.setText(str(suma)) 27 | 28 | def main(): 29 | app = QApplication(sys.argv) 30 | ventana = AplicacionVentana() 31 | ventana.show() 32 | 33 | sys.exit(app.exec_()) 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /parte17/demo45_aplicacion_saludo.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox 4 | from demo45_saludo import Ui_SaludoVentana 5 | 6 | class AplicacionSaludoVentana(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.ui = Ui_SaludoVentana() 14 | self.ui.setupUi(self) 15 | 16 | self.ui.btn_saludar.clicked.connect(self.saludar) 17 | 18 | self.show() 19 | 20 | def saludar(self): 21 | nombre = self.ui.txt_nombre.text().strip() 22 | 23 | mensaje = QMessageBox(self) 24 | mensaje.setWindowTitle('Mensaje') 25 | 26 | if len(nombre): 27 | mensaje.setIcon(QMessageBox.Information) 28 | mensaje.setText(f'¡Hola, {nombre}!') 29 | else: 30 | mensaje.setIcon(QMessageBox.Warning) 31 | mensaje.setText('Debe escribir un nombre.') 32 | 33 | mensaje.exec_() 34 | 35 | def main(): 36 | app = QApplication(sys.argv) 37 | ventana = AplicacionSaludoVentana() 38 | ventana.show() 39 | 40 | sys.exit(app.exec_()) 41 | 42 | if __name__ == "__main__": 43 | main() 44 | -------------------------------------------------------------------------------- /parte17/demo48_aplicacion_pizzeria.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow 4 | from demo48_pizzeria import Ui_Pizzeria 5 | 6 | class AplicacionPizzeria(QMainWindow): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.ui = Ui_Pizzeria() 14 | self.ui.setupUi(self) 15 | 16 | self.ui.chk_queso.stateChanged.connect(self.calcular_precio) 17 | self.ui.chk_aceitunas.stateChanged.connect(self.calcular_precio) 18 | self.ui.chk_salsas.stateChanged.connect(self.calcular_precio) 19 | 20 | self.show() 21 | 22 | def calcular_precio(self): 23 | precio = 15 24 | 25 | if self.ui.chk_queso.isChecked(): 26 | precio += 1 27 | 28 | if self.ui.chk_aceitunas.isChecked(): 29 | precio += 2 30 | 31 | if self.ui.chk_salsas.isChecked(): 32 | precio += 1 33 | 34 | self.ui.lbl_precio_final.setText(f'Precio final: ${precio}') 35 | 36 | def main(): 37 | app = QApplication(sys.argv) 38 | ventana = AplicacionPizzeria() 39 | ventana.show() 40 | 41 | sys.exit(app.exec_()) 42 | 43 | if __name__ == "__main__": 44 | main() 45 | -------------------------------------------------------------------------------- /parte17/demo51_aplicacion_segniales_slots.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo51_segniales_slots import Ui_SegnialesSlots 5 | 6 | class Aplicacion(QDialog): 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializarGui() 11 | 12 | def inicializarGui(self): 13 | self.ui = Ui_SegnialesSlots() 14 | self.ui.setupUi(self) 15 | 16 | self.show() 17 | 18 | def main(): 19 | app = QApplication(sys.argv) 20 | ventana = Aplicacion() 21 | 22 | sys.exit(app.exec_()) 23 | 24 | if __name__ == "__main__": 25 | main() 26 | -------------------------------------------------------------------------------- /parte17/demo55_aplicacion_diagnosticos.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo55_diagnosticos import Ui_Diagnosticos 5 | 6 | class AplicacionDiagnosticos(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_Diagnosticos() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.lst_diagnosticos.itemClicked.connect(self.mostrar_diagnostico_seleccionado) 18 | 19 | self.show() 20 | 21 | def mostrar_diagnostico_seleccionado(self, diagnostico): 22 | self.ui.lbl_diagnostico_seleccionado.setText(diagnostico.text()) 23 | 24 | def main(): 25 | app = QApplication(sys.argv) 26 | dialogo = AplicacionDiagnosticos() 27 | dialogo.show() 28 | 29 | sys.exit(app.exec_()) 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /parte17/demo56_aplicacion_diagnosticos.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo56_diagnosticos import Ui_Diagnosticos 5 | 6 | class AplicacionDiagnosticos(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_Diagnosticos() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.lst_diagnosticos.itemSelectionChanged.connect(self.seleccionar_diagnosticos) 18 | 19 | self.show() 20 | 21 | def seleccionar_diagnosticos(self): 22 | self.ui.lst_diagnosticos_seleccionados.clear() 23 | 24 | diagnosticos = list(self.ui.lst_diagnosticos.selectedItems()) 25 | 26 | for d in diagnosticos: 27 | self.ui.lst_diagnosticos_seleccionados.addItem(d.text()) 28 | 29 | def main(): 30 | app = QApplication(sys.argv) 31 | dialogo = AplicacionDiagnosticos() 32 | dialogo.show() 33 | 34 | sys.exit(app.exec_()) 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /parte17/demo57_aplicacion_comidas_favoritas.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog, QMessageBox 4 | from demo57_comidas_favoritas import Ui_ComidaFavorita 5 | 6 | class AplicacionComidasFavoritas(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_ComidaFavorita() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.btn_agregar.clicked.connect(self.agregar_comida) 18 | 19 | self.show() 20 | 21 | def agregar_comida(self): 22 | nombre_comida = self.ui.txt_nombre_comida_favorita.text().strip() 23 | 24 | if len(nombre_comida): 25 | self.ui.lst_comidas_favoritas.addItem(nombre_comida) 26 | else: 27 | mensaje = QMessageBox(self) 28 | mensaje.setWindowTitle('Mensaje') 29 | mensaje.setIcon(QMessageBox.Warning) 30 | mensaje.setText('El campo Nombre comida favorita es obligatorio.') 31 | mensaje.exec_() 32 | 33 | def main(): 34 | app = QApplication(sys.argv) 35 | dialogo = AplicacionComidasFavoritas() 36 | 37 | sys.exit(app.exec_()) 38 | 39 | if __name__ == "__main__": 40 | main() 41 | -------------------------------------------------------------------------------- /parte17/demo59_aplicacion_seleccion_lenguaje.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo59_seleccion_lenguaje import Ui_Lenguajes 5 | 6 | class AplicacionSeleccionLenguaje(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_Lenguajes() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.cbx_lenguajes.currentIndexChanged.connect(self.seleccionar_lenguaje) 18 | 19 | self.show() 20 | 21 | def seleccionar_lenguaje(self): 22 | indice = self.ui.cbx_lenguajes.currentIndex() 23 | seleccion = self.ui.cbx_lenguajes.itemText(indice) 24 | 25 | self.ui.lbl_seleccion.setText(f'El lenguaje seleccionado es: {seleccion}') 26 | 27 | def main(): 28 | app = QApplication(sys.argv) 29 | dialogo = AplicacionSeleccionLenguaje() 30 | 31 | sys.exit(app.exec_()) 32 | 33 | if __name__ == "__main__": 34 | main() 35 | -------------------------------------------------------------------------------- /parte17/demo60_aplicacion_editor_texto.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from PyQt5.QtGui import QFont 5 | from demo60_editor_texto import Ui_EditorTexto 6 | 7 | class AplicacionEditorTexto(QDialog): 8 | 9 | def __init__(self): 10 | super().__init__() 11 | 12 | self.inicializarGui() 13 | 14 | def inicializarGui(self): 15 | self.ui = Ui_EditorTexto() 16 | self.ui.setupUi(self) 17 | 18 | self.ui.cbx_fuentes.currentIndexChanged.connect(self.cambiar_fuente) 19 | 20 | self.show() 21 | 22 | def cambiar_fuente(self): 23 | indice = self.ui.cbx_fuentes.currentIndex() 24 | fuente = QFont(self.ui.cbx_fuentes.itemText(indice), 15) 25 | self.ui.txt_editor.setFont(fuente) 26 | 27 | def main(): 28 | app = QApplication(sys.argv) 29 | dialogo = AplicacionEditorTexto() 30 | 31 | sys.exit(app.exec_()) 32 | 33 | if __name__ == "__main__": 34 | main() 35 | -------------------------------------------------------------------------------- /parte17/demo61_aplicacion_editor_texto.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from PyQt5.QtGui import QFont 5 | from demo61_editor_texto import Ui_EditorTexto 6 | 7 | class AplicacionEditorTexto(QDialog): 8 | 9 | def __init__(self): 10 | super().__init__() 11 | 12 | self.inicializarGui() 13 | 14 | def inicializarGui(self): 15 | self.ui = Ui_EditorTexto() 16 | self.ui.setupUi(self) 17 | 18 | self.cambiar_fuente() 19 | 20 | self.ui.fcb_fuentes.currentFontChanged.connect(self.cambiar_fuente) 21 | 22 | self.show() 23 | 24 | def cambiar_fuente(self): 25 | indice = self.ui.fcb_fuentes.currentIndex() 26 | fuente = QFont(self.ui.fcb_fuentes.itemText(indice), 15) 27 | self.ui.txt_editor.setFont(fuente) 28 | 29 | def main(): 30 | app = QApplication(sys.argv) 31 | dialogo = AplicacionEditorTexto() 32 | 33 | sys.exit(app.exec_()) 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /parte17/demo62_aplicacion_gestor_descargas.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo62_gestor_descargas import Ui_GestorDescargas 5 | 6 | class AplicacionGestorDescargas(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_GestorDescargas() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.btn_iniciar_descarga.clicked.connect(self.iniciar_descarga) 18 | 19 | self.show() 20 | 21 | def iniciar_descarga(self): 22 | contador = 0 23 | 24 | while contador < 100: 25 | contador += 0.0001 26 | self.ui.pbr_descarga.setValue(contador) 27 | 28 | def main(): 29 | app = QApplication(sys.argv) 30 | dialogo = AplicacionGestorDescargas() 31 | 32 | sys.exit(app.exec_()) 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /parte17/demo64_aplicacion_reloj_digital.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from PyQt5.QtCore import QTime, QTimer 5 | from demo64_reloj_digital import Ui_RelojDigital 6 | 7 | class AplicacionRelojDigital(QDialog): 8 | 9 | def __init__(self): 10 | super().__init__() 11 | 12 | self.inicializarGui() 13 | 14 | def inicializarGui(self): 15 | self.ui = Ui_RelojDigital() 16 | self.ui.setupUi(self) 17 | 18 | timer = QTimer(self) 19 | timer.timeout.connect(self.tick) 20 | timer.start(1000) 21 | 22 | self.show() 23 | 24 | def tick(self): 25 | hora = QTime.currentTime() 26 | hora_texto = hora.toString('hh:mm') 27 | 28 | self.ui.lcd_hora.display(hora_texto) 29 | 30 | def main(): 31 | app = QApplication(sys.argv) 32 | dialogo = AplicacionRelojDigital() 33 | 34 | sys.exit(app.exec_()) 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /parte17/demo64_reloj_digital.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | RelojDigital 4 | 5 | 6 | 7 | 0 8 | 0 9 | 320 10 | 200 11 | 12 | 13 | 14 | 15 | 320 16 | 200 17 | 18 | 19 | 20 | 21 | 320 22 | 200 23 | 24 | 25 | 26 | Reloj Digital 27 | 28 | 29 | 30 | 31 | 4 32 | 5 33 | 311 34 | 181 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /parte17/demo65_aplicacion_calendario.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo65_calendario import Ui_Almanaque 5 | 6 | class AplicacionCalendario(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_Almanaque() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.cal_calendario.selectionChanged.connect(self.cambiar_fecha) 18 | 19 | self.show() 20 | 21 | def cambiar_fecha(self): 22 | self.ui.det_fecha_seleccionada.setDate(self.ui.cal_calendario.selectedDate()) 23 | 24 | def main(): 25 | app = QApplication(sys.argv) 26 | dialogo = AplicacionCalendario() 27 | 28 | sys.exit(app.exec_()) 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /parte17/demo67_aplicacion_tabla_lenguajes.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo67_tabla_lenguajes import Ui_TablaLenguajes 5 | 6 | class AplicacionTablaLenguajes(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_TablaLenguajes() 15 | self.ui.setupUi(self) 16 | 17 | self.show() 18 | 19 | def main(): 20 | app = QApplication(sys.argv) 21 | dialogo = AplicacionTablaLenguajes() 22 | 23 | sys.exit(app.exec_()) 24 | 25 | if __name__ == "__main__": 26 | main() 27 | 506 -------------------------------------------------------------------------------- /parte17/demo70_aplicacion_seleccion_pais.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog, QInputDialog 4 | from demo70_seleccion_pais import Ui_SeleccionPais 5 | 6 | class AplicacionSeleccionPais(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializarGui() 12 | 13 | def inicializarGui(self): 14 | self.ui = Ui_SeleccionPais() 15 | self.ui.setupUi(self) 16 | 17 | self.paises = ('Argentina', 'Bolivia', 'Brasil', 'Chile', 'Colombia', 'Ecuador', 'Paraguay', 'Perú', 'Uruguay', 'Venezuela') 18 | 19 | self.ui.btn_seleccion_pais.clicked.connect(self.seleccionar_pais) 20 | 21 | self.show() 22 | 23 | def seleccionar_pais(self): 24 | pais, estado = QInputDialog.getItem(self, 'Selección País', 'Seleccione su país:', self.paises, 4, False) 25 | 26 | if estado and pais: 27 | self.ui.txt_pais_seleccionado.setText(pais) 28 | 29 | def main(): 30 | app = QApplication(sys.argv) 31 | dialogo = AplicacionSeleccionPais() 32 | 33 | sys.exit(app.exec_()) 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /parte17/demo71_aplicacion_selector_color.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QColorDialog, QDialog 4 | from demo71_selector_color import Ui_SelectorColor 5 | 6 | class AplicacionSelectorColor(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializar_gui() 12 | 13 | def inicializar_gui(self): 14 | self.ui = Ui_SelectorColor() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.btn_seleccionar_color.clicked.connect(self.cambiar_color) 18 | 19 | self.show() 20 | 21 | def cambiar_color(self): 22 | color = QColorDialog.getColor() 23 | 24 | if color.isValid(): 25 | self.ui.frm_color_selecciondo.setStyleSheet("QWidget {background-color: %s}" % color.name()) 26 | self.ui.lbl_color_seleccionado.setText(str(color.name())) 27 | 28 | def main(): 29 | app = QApplication(sys.argv) 30 | dialogo = AplicacionSelectorColor() 31 | 32 | sys.exit(app.exec_()) 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /parte17/demo72_aplicacion_selector_fuente.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog, QFontDialog 4 | from demo72_selector_fuente import Ui_SelectorFuente 5 | 6 | class AplicacionSelectorFuente(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializar_gui() 12 | 13 | def inicializar_gui(self): 14 | self.ui = Ui_SelectorFuente() 15 | self.ui.setupUi(self) 16 | 17 | self.ui.txt_contenido.setText('PyQt5') 18 | 19 | self.ui.btn_seleccionar_fuente.clicked.connect(self.seleccionar_fuente) 20 | 21 | self.show() 22 | 23 | def seleccionar_fuente(self): 24 | fuente, ok = QFontDialog.getFont() 25 | 26 | if ok: 27 | self.ui.txt_contenido.setFont(fuente) 28 | 29 | def main(): 30 | app = QApplication(sys.argv) 31 | dialogo = AplicacionSelectorFuente() 32 | 33 | sys.exit(app.exec_()) 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /parte17/demo75_aplicacion_restaurante_pedidos.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QDialog 4 | from demo75_restaurante_pedidos import Ui_RestaurantePedidos 5 | 6 | class AplicacionRestaurantePedidos(QDialog): 7 | 8 | def __init__(self): 9 | super().__init__() 10 | 11 | self.inicializar_gui() 12 | 13 | def inicializar_gui(self): 14 | self.ui = Ui_RestaurantePedidos() 15 | self.ui.setupUi(self) 16 | 17 | self.show() 18 | 19 | def main(): 20 | app = QApplication(sys.argv) 21 | dialogo = AplicacionRestaurantePedidos() 22 | 23 | sys.exit(app.exec_()) 24 | 25 | if __name__ == "__main__": 26 | main() 27 | -------------------------------------------------------------------------------- /parte17/demo77_aplicacion_descarga_archivo.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from threading import Thread 3 | from time import sleep 4 | 5 | from PyQt5.QtWidgets import QApplication, QDialog 6 | from demo77_descarga_archivo import Ui_DescargaArchivo 7 | 8 | class AplicacionDescargaArchivo(QDialog): 9 | 10 | def __init__(self): 11 | super().__init__() 12 | 13 | self.inicializar_gui() 14 | 15 | def inicializar_gui(self): 16 | self.ui = Ui_DescargaArchivo() 17 | self.ui.setupUi(self) 18 | 19 | self.show() 20 | 21 | class ProcesoDescargaArchivo(Thread): 22 | 23 | def __init__(self, dialogo): 24 | Thread.__init__(self) 25 | 26 | self.dialogo = dialogo 27 | self.contador = 0 28 | 29 | def run(self): 30 | while self.contador <= 100: 31 | sleep(1) 32 | self.dialogo.ui.pgr_descarga_archivo.setValue(self.contador) 33 | self.contador += 10 34 | 35 | def main(): 36 | app = QApplication(sys.argv) 37 | dialogo = AplicacionDescargaArchivo() 38 | 39 | proceso = ProcesoDescargaArchivo(dialogo) 40 | proceso.start() 41 | 42 | sys.exit(app.exec_()) 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /parte17/demo80.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo80.db -------------------------------------------------------------------------------- /parte17/demo82.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo82.db -------------------------------------------------------------------------------- /parte17/demo83.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo83.db -------------------------------------------------------------------------------- /parte17/demo84.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo84.db -------------------------------------------------------------------------------- /parte17/demo85.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo85.db -------------------------------------------------------------------------------- /parte17/demo86.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo86.db -------------------------------------------------------------------------------- /parte17/demo86_hashing.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import binascii 3 | import os 4 | 5 | # Fuente: https://www.vitoshacademy.com/hashing-passwords-in-python/ 6 | def hash_password(password): 7 | """Hash a password for storing.""" 8 | salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii') 9 | pwdhash = hashlib.pbkdf2_hmac('sha512', password.encode('utf-8'), 10 | salt, 100000) 11 | pwdhash = binascii.hexlify(pwdhash) 12 | return (salt + pwdhash).decode('ascii') 13 | 14 | print(hash_password('User2k20')) 15 | print() 16 | print(hash_password('Adm1n@2020')) 17 | -------------------------------------------------------------------------------- /parte17/demo87.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo87.db -------------------------------------------------------------------------------- /parte17/demo88.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/demo88.db -------------------------------------------------------------------------------- /parte17/demo89_aplicacion_puntero_mouse.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow 4 | from PyQt5.QtCore import Qt 5 | from demo89_posicion_puntero_mouse import Ui_VentanaPrincipal 6 | 7 | class AplicacionPunteroMouse(QMainWindow): 8 | 9 | def __init__(self): 10 | super().__init__() 11 | 12 | self.inicializar_gui() 13 | 14 | def inicializar_gui(self): 15 | self.ui = Ui_VentanaPrincipal() 16 | self.ui.setupUi(self) 17 | 18 | self.show() 19 | 20 | def mousePressEvent(self, event): 21 | if event.buttons() & Qt.LeftButton: 22 | x = event.x() 23 | y = event.y() 24 | 25 | texto = f'El botón del mouse se presionó en x = {x}, y = {y}' 26 | 27 | self.ui.stt_principal.showMessage(texto, 2000) 28 | 29 | def mouseReleaseEvent(self, event): 30 | x = event.x() 31 | y = event.y() 32 | 33 | texto = f'El botón del mouse se soltó en x = {x}, y = {y}' 34 | 35 | self.ui.stt_principal.showMessage(texto, 2000) 36 | 37 | self.update() 38 | 39 | def main(): 40 | app = QApplication(sys.argv) 41 | ventana = AplicacionPunteroMouse() 42 | 43 | sys.exit(app.exec_()) 44 | 45 | if __name__ == "__main__": 46 | main() 47 | -------------------------------------------------------------------------------- /parte17/demo89_posicion_puntero_mouse.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | VentanaPrincipal 4 | 5 | 6 | 7 | 0 8 | 0 9 | 480 10 | 400 11 | 12 | 13 | 14 | Coordenadas Puntero del Mouse 15 | 16 | 17 | 18 | 19 | 20 | 0 21 | 0 22 | 480 23 | 21 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /parte17/demo90_aplicacion_dibujo_punto.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow 4 | from PyQt5.QtGui import QPainter, QPen 5 | from PyQt5.QtCore import Qt 6 | from demo90_dibujo_punto import Ui_DibujoPunto 7 | 8 | class AplicacionDibujoPunto(QMainWindow): 9 | 10 | def __init__(self): 11 | super().__init__() 12 | 13 | self.inicializar_gui() 14 | 15 | def inicializar_gui(self): 16 | self.ui = Ui_DibujoPunto() 17 | self.ui.setupUi(self) 18 | 19 | self.posicion = [0, 0] 20 | 21 | self.show() 22 | 23 | def mousePressEvent(self, event): 24 | if event.buttons() & Qt.LeftButton: 25 | self.posicion[0] = event.pos().x() 26 | self.posicion[1] = event.pos().y() 27 | 28 | self.update() 29 | 30 | def paintEvent(self, event): 31 | painter = QPainter() 32 | painter.begin(self) 33 | 34 | pincel = QPen(Qt.black, 7) 35 | painter.setPen(pincel) 36 | 37 | painter.drawPoint(self.posicion[0], self.posicion[1]) 38 | painter.end() 39 | 40 | def main(): 41 | app = QApplication(sys.argv) 42 | ventana = AplicacionDibujoPunto() 43 | 44 | sys.exit(app.exec_()) 45 | 46 | if __name__ == "__main__": 47 | main() 48 | -------------------------------------------------------------------------------- /parte17/demo90_dibujo_punto.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DibujoPunto 4 | 5 | 6 | 7 | 0 8 | 0 9 | 640 10 | 480 11 | 12 | 13 | 14 | Dibujar Puntos 15 | 16 | 17 | 18 | 19 | 20 | 10 21 | 10 22 | 351 23 | 16 24 | 25 | 26 | 27 | Haga click en cualquier región de esta ventana para dibujar un punto. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 0 35 | 0 36 | 640 37 | 21 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /parte17/demo91_dibujo_linea.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DibujoLinea 4 | 5 | 6 | 7 | 0 8 | 0 9 | 640 10 | 480 11 | 12 | 13 | 14 | Dibujo Línea 15 | 16 | 17 | 18 | 19 | 20 | 10 21 | 10 22 | 371 23 | 21 24 | 25 | 26 | 27 | Dibuje una línea con el mouse indicando un punto de inicio y un punto final. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 0 35 | 0 36 | 640 37 | 21 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /parte17/demo93_dibujo_circulo.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DibujoCirculo 4 | 5 | 6 | 7 | 0 8 | 0 9 | 640 10 | 480 11 | 12 | 13 | 14 | Dibujo Círculo 15 | 16 | 17 | 18 | 19 | 20 | 10 21 | 10 22 | 461 23 | 16 24 | 25 | 26 | 27 | Click en un punto específico y arrastre el mouse hasta otra ubicación para dibujar un círculo. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 0 35 | 0 36 | 640 37 | 21 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /parte17/demo94_dibujo_rectangulo.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DibujoRectangulo 4 | 5 | 6 | 7 | 0 8 | 0 9 | 640 10 | 480 11 | 12 | 13 | 14 | Dibujo Rectángulo 15 | 16 | 17 | 18 | 19 | 20 | 20 21 | 10 22 | 481 23 | 16 24 | 25 | 26 | 27 | Click en un punto específico y arrastre el mouse hasta otra ubicación para dibujar un rectángulo. 28 | 29 | 30 | 31 | 32 | 33 | 34 | 0 35 | 0 36 | 640 37 | 21 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /parte17/demo96_aplicacion_animacion_objeto.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from PyQt5.QtWidgets import QApplication, QMainWindow 4 | from PyQt5.QtCore import QPropertyAnimation, QRect 5 | from PyQt5.QtGui import QPixmap 6 | from demo96_animacion_objeto import Ui_AnimacionObjeto 7 | 8 | class AplicacionAnimacionObjeto(QMainWindow): 9 | 10 | def __init__(self): 11 | super().__init__() 12 | 13 | self.inicializar_gui() 14 | 15 | def inicializar_gui(self): 16 | self.ui = Ui_AnimacionObjeto() 17 | self.ui.setupUi(self) 18 | 19 | imagen = 'parte17/ball.jpg' 20 | self.ui.lbl_imagen.setPixmap(QPixmap(imagen)) 21 | 22 | self.ui.btn_iniciar_animacion.clicked.connect(self.iniciar_animacion) 23 | 24 | self.show() 25 | 26 | def iniciar_animacion(self): 27 | self.animacion = QPropertyAnimation(self.ui.lbl_imagen, b"geometry") 28 | self.animacion.setDuration(7000) 29 | self.animacion.setStartValue(QRect(190, 10, 96, 96)) 30 | self.animacion.setEndValue(QRect(190, 10, 450, 450)) 31 | self.animacion.start() 32 | 33 | def main(): 34 | app = QApplication(sys.argv) 35 | ventana = AplicacionAnimacionObjeto() 36 | 37 | sys.exit(app.exec_()) 38 | 39 | if __name__ == "__main__": 40 | main() 41 | -------------------------------------------------------------------------------- /parte17/ex1-iconos-recursos.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | circuloIcon.ico 4 | lineaIcon.ico 5 | rectanguloIcon.ico 6 | 7 | 8 | -------------------------------------------------------------------------------- /parte17/ex1_iconos_recursos.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | circuloIcon.ico 4 | lineaIcon.ico 5 | rectanguloIcon.ico 6 | 7 | 8 | -------------------------------------------------------------------------------- /parte17/lineaIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/lineaIcon.ico -------------------------------------------------------------------------------- /parte17/new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/new.png -------------------------------------------------------------------------------- /parte17/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/open.png -------------------------------------------------------------------------------- /parte17/proyecto0/inventario/__init__.py: -------------------------------------------------------------------------------- 1 | # Incorporación o inclusión de otros módulos. -------------------------------------------------------------------------------- /parte17/proyecto0/inventario/inventario.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/proyecto0/inventario/inventario.pickle -------------------------------------------------------------------------------- /parte17/proyecto0/inventario/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/proyecto0/inventario/modelos/__init__.py -------------------------------------------------------------------------------- /parte17/proyecto0/inventario/modelos/producto.py: -------------------------------------------------------------------------------- 1 | class Producto: 2 | def __init__(self, codigo, nombre, precio, cantidad, disponible): 3 | self.codigo = codigo 4 | self.nombre = nombre 5 | self.precio = precio 6 | self.cantidad = cantidad 7 | self.disponible = disponible 8 | -------------------------------------------------------------------------------- /parte17/proyecto0/inventario/modelos/venta.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | class Venta: 4 | def __init__(self, codigo_producto, cantidad, total_sin_iva): 5 | self.codigo_producto = codigo_producto 6 | self.fecha = datetime.now() 7 | self.cantidad = cantidad 8 | self.total_sin_iva = total_sin_iva 9 | -------------------------------------------------------------------------------- /parte17/proyecto0/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='inventario', version='1.0.0', packages=['inventario'], 4 | entry_points= { 5 | 'console_scripts': ['inventario = inventario.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte17/pyqt_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/pyqt_logo.png -------------------------------------------------------------------------------- /parte17/rectanguloIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/rectanguloIcon.ico -------------------------------------------------------------------------------- /parte17/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte17/save.png -------------------------------------------------------------------------------- /parte18/Parte18-Ejercicios.txt: -------------------------------------------------------------------------------- 1 | Ejercicio 1. En el Proyecto 0 se construyó un sistema de gestión de inventario de dispositivos electrónicos para la empresa Dispositivos S.a.s. 2 | 3 | Se requiere remodelar la aplicación basada en consola en una aplicación con interfaz gráfica de usuario. 4 | 5 | Se debe utilizar un enfoque basado en MDI (Multiple Document Interface) con la librería Tkinter. 6 | -------------------------------------------------------------------------------- /parte18/demo01_introduccion_tkinter.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | ventana = tk.Tk() 4 | ventana.geometry('300x300+20+30') 5 | ventana.title('Intro Tkinter') 6 | ventana.mainloop() 7 | -------------------------------------------------------------------------------- /parte18/demo02_ventana_tkinter.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaPrincipal(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | self.pack() 9 | 10 | def main(): 11 | principal = tk.Tk() 12 | principal.geometry('300x300') 13 | principal.title('Ventana Principal') 14 | 15 | aplicacion = VentanaPrincipal(principal) 16 | aplicacion.mainloop() 17 | 18 | if __name__ == "__main__": 19 | main() 20 | -------------------------------------------------------------------------------- /parte18/demo03_ventana_mensaje.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | ventana = tk.Tk() 4 | ventana.geometry('300x300') 5 | 6 | lbl_saludo = tk.Label(ventana, text='¡Hola, tk!', font=('Arial', 23), fg='green', bg='black', width=10) 7 | lbl_saludo.pack() 8 | lbl_saludo.place(x=20, y=150) 9 | 10 | ventana.mainloop() 11 | -------------------------------------------------------------------------------- /parte18/demo03_ventana_mensaje_oop.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaPrincipal(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | self.pack() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.lbl_mensaje = tk.Label(self.master, text='¡Hola, Tkinter!', font=('Arial', 23), fg='#00ff00', bg='#000000') 14 | self.lbl_mensaje.place(x=30, y=150) 15 | 16 | def main(): 17 | root = tk.Tk() 18 | root.title('Saludo Tkinter') 19 | root.geometry('300x300') 20 | 21 | principal = VentanaPrincipal(root) 22 | 23 | principal.mainloop() 24 | 25 | if __name__ == "__main__": 26 | main() 27 | -------------------------------------------------------------------------------- /parte18/demo04_dialogo_mensaje_messagebox.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | class VentanaPrincipal(tk.Frame): 5 | 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | 9 | self.master = master 10 | self.pack() 11 | 12 | self.inicializar_gui() 13 | 14 | def inicializar_gui(self): 15 | messagebox.showinfo('Mensaje informativo', '¡Hola, Tkinter!') 16 | messagebox.showwarning('Mensaje de advertencia', 'Revise todos los campos del formulario.') 17 | messagebox.showerror('Mensaje de error', 'Hay problemas con la conexión a Internet.') 18 | 19 | def main(): 20 | app = tk.Tk() 21 | app.title('Mensajes de Diálogo') 22 | app.geometry('350x350') 23 | 24 | ventana = VentanaPrincipal(app) 25 | ventana.mainloop() 26 | 27 | if __name__ == "__main__": 28 | main() 29 | -------------------------------------------------------------------------------- /parte18/demo05_mensaje_saludo_click_boton.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | class VentanaPrincipal(tk.Frame): 5 | 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | self.pack() 9 | 10 | self.master = master 11 | 12 | self.inicializar_gui() 13 | 14 | def inicializar_gui(self): 15 | self.btn_saludar = tk.Button(self) 16 | self.btn_saludar['text'] = 'Saludar' 17 | self.btn_saludar['command'] = self.saludar 18 | self.btn_saludar.pack(side='top') 19 | 20 | def saludar(self): 21 | messagebox.showinfo('Saludo', '¡Hola, Usuario!') 22 | 23 | def main(): 24 | aplicacion = tk.Tk() 25 | aplicacion.title('Ventana Principal') 26 | aplicacion.geometry('300x300') 27 | 28 | ventana = VentanaPrincipal(aplicacion) 29 | ventana.mainloop() 30 | 31 | if __name__ == "__main__": 32 | main() 33 | -------------------------------------------------------------------------------- /parte18/demo06_mensaje_saludo_terminar.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | class VentanaPrincipal(tk.Frame): 5 | 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | self.master = master 9 | 10 | self.pack() 11 | 12 | self.inicilizar_gui() 13 | 14 | def inicilizar_gui(self): 15 | self.btn_saludar = tk.Button(self) 16 | self.btn_saludar['text'] = 'Saludar' 17 | self.btn_saludar['command'] = self.saludar 18 | self.btn_saludar.pack(side='top') 19 | 20 | self.btn_terminar = tk.Button(self, text='Terminar aplicación', fg='red', command=self.terminar) 21 | self.btn_terminar.pack(side='bottom') 22 | 23 | def saludar(self): 24 | messagebox.showinfo('Saludo', '¡Hola, Tkinter!') 25 | 26 | def terminar(self): 27 | self.master.destroy() 28 | 29 | def main(): 30 | app = tk.Tk() 31 | app.title('Ventana Principal') 32 | app.geometry('350x350') 33 | 34 | ventana = VentanaPrincipal(app) 35 | 36 | ventana.mainloop() 37 | 38 | if __name__ == "__main__": 39 | main() 40 | -------------------------------------------------------------------------------- /parte18/demo07_captura_datos.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | class VentanaPrincipal(tk.Frame): 5 | 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | self.master = master 9 | self.pack() 10 | 11 | self.inicializar_gui() 12 | 13 | def inicializar_gui(self): 14 | lbl_nombre = tk.Label(self, text='Nombre:') 15 | lbl_nombre.grid(row=0, column=0) 16 | 17 | self.txt_nombre = tk.Entry(self, width=20) 18 | self.txt_nombre.grid(row=0, column=1) 19 | 20 | self.btn_saludar = tk.Button(self, text='Saludar') 21 | self.btn_saludar['command'] = self.saludar 22 | self.btn_saludar.grid(row=0, column=2) 23 | 24 | def saludar(self): 25 | nombre = self.txt_nombre.get().strip() 26 | 27 | if len(nombre): 28 | messagebox.showinfo('Información', f'¡Hola, {nombre}!') 29 | else: 30 | messagebox.showwarning('Mensaje', 'Debe escribir un nombre.') 31 | 32 | def main(): 33 | app = tk.Tk() 34 | app.title('Ventana Principal - Captura Datos') 35 | app.geometry('350x300') 36 | 37 | ventana = VentanaPrincipal(app) 38 | 39 | ventana.mainloop() 40 | 41 | if __name__ == "__main__": 42 | main() 43 | -------------------------------------------------------------------------------- /parte18/demo15_area_texto_scrolledtext.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | from tkinter import scrolledtext 4 | 5 | class FormularioComentario(tk.Frame): 6 | 7 | def __init__(self, master=None): 8 | super().__init__(master) 9 | self.master = master 10 | self.pack() 11 | 12 | self.inicializar_gui() 13 | 14 | def inicializar_gui(self): 15 | tk.Label(self, text='Deje un comentario...').grid(row=0, column=0) 16 | 17 | self.txa_comentario = scrolledtext.ScrolledText(self, width=40, height=15, wrap=tk.WORD, font=('Arial', 17)) 18 | self.txa_comentario.grid(column=0, padx=10, pady=10) 19 | self.txa_comentario.focus() 20 | 21 | tk.Button(self, text='Guardar comentario', command=self.guardar_comentario).grid(column=0) 22 | 23 | def guardar_comentario(self): 24 | comentario = self.txa_comentario.get("1.0", tk.END) 25 | 26 | messagebox.showinfo('Mensaje', comentario) 27 | 28 | def main(): 29 | app = tk.Tk() 30 | app.title('Comentario') 31 | app.geometry('550x500') 32 | 33 | ventana = FormularioComentario(app) 34 | ventana.mainloop() 35 | 36 | if __name__ == "__main__": 37 | main() 38 | -------------------------------------------------------------------------------- /parte18/demo16_selector_dato_scale.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class SeleccionDato(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | self.pack() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.valor_seleccionado = tk.DoubleVar() 14 | 15 | self.scl_dato = tk.Scale(self, variable=self.valor_seleccionado, from_=1, to=100, orient=tk.HORIZONTAL) 16 | self.scl_dato.pack() 17 | 18 | tk.Label(self, text='Scale horizontal').pack() 19 | 20 | tk.Button(self, text='Seleccionar valor', command=self.seleccionar_valor).pack() 21 | 22 | self.lbl_valor_seleccionado = tk.Label(self) 23 | self.lbl_valor_seleccionado.pack() 24 | 25 | def seleccionar_valor(self): 26 | seleccion = f'El valor seleccionado es: {self.valor_seleccionado.get()}' 27 | 28 | self.lbl_valor_seleccionado.config(text=seleccion, font=('Courier', 15)) 29 | 30 | def main(): 31 | app = tk.Tk() 32 | app.title('Selector de Datos') 33 | app.geometry('350x300') 34 | 35 | ventana = SeleccionDato(app) 36 | ventana.mainloop() 37 | 38 | if __name__ == "__main__": 39 | main() 40 | -------------------------------------------------------------------------------- /parte18/demo17_apertura_archivo.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import scrolledtext 3 | from tkinter.filedialog import askopenfile 4 | 5 | class AperturaArchivo(tk.Frame): 6 | 7 | def __init__(self, master=None): 8 | super().__init__(master) 9 | self.master = master 10 | self.pack() 11 | 12 | self.inicializar_gui() 13 | 14 | def inicializar_gui(self): 15 | self.btn_seleccionar_archivo = tk.Button(self, text='Seleccionar archivo...') 16 | self.btn_seleccionar_archivo['command'] = self.seleccionar_archivo 17 | self.btn_seleccionar_archivo.pack() 18 | 19 | self.txa_contenido_archivo = scrolledtext.ScrolledText(self, width=40, height=30, wrap=tk.WORD, font=('Arial', 15)) 20 | self.txa_contenido_archivo.pack() 21 | 22 | def seleccionar_archivo(self): 23 | archivo = askopenfile(mode='r', filetypes=[('Archivos de texto', '*.txt')]) 24 | 25 | if archivo is not None: 26 | contenido = archivo.read() 27 | self.txa_contenido_archivo.insert(tk.INSERT, contenido) 28 | 29 | def main(): 30 | app = tk.Tk() 31 | app.title('Apertura Archivos') 32 | app.geometry('350x400') 33 | 34 | ventana = AperturaArchivo(app) 35 | 36 | ventana.mainloop() 37 | 38 | if __name__ == "__main__": 39 | main() 40 | -------------------------------------------------------------------------------- /parte18/demo20_barra_menus.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class Aplicacion(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | self.pack() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | mbr_principal = tk.Menu(self.master) 14 | mnu_archivo = tk.Menu(mbr_principal) 15 | 16 | mnu_archivo.add_command(label='Abrir') 17 | mnu_archivo.add_command(label='Guardar') 18 | mnu_archivo.add_command(label='Salir', command=self.salir) 19 | mbr_principal.add_cascade(label='Archivo', menu=mnu_archivo) 20 | 21 | self.master.config(menu=mbr_principal) 22 | 23 | def salir(self): 24 | self.master.destroy() 25 | 26 | def main(): 27 | ventana_principal = tk.Tk() 28 | ventana_principal.title('Barra de menu') 29 | ventana_principal.geometry('350x300') 30 | 31 | app = Aplicacion(ventana_principal) 32 | app.mainloop() 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /parte18/demo21_pestanas_tabs.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import ttk 3 | 4 | class VentanaPrincipal(tk.Frame): 5 | 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | self.master = master 9 | self.pack() 10 | 11 | self.inicializar_gui() 12 | 13 | def inicializar_gui(self): 14 | contenedor = ttk.Notebook(self.master) 15 | tab_datos = ttk.Frame(contenedor) 16 | contenedor.add(tab_datos, text='Datos') 17 | 18 | lbl_python = tk.Label(tab_datos, text='Python') 19 | lbl_python.grid(row=0, column=0) 20 | 21 | tab_informacion = ttk.Frame(contenedor) 22 | contenedor.add(tab_informacion, text='Información') 23 | 24 | lbl_programacion = tk.Label(tab_informacion, text='Programación') 25 | lbl_programacion.grid(row=0, column=0) 26 | 27 | txt_nombre = tk.Entry(tab_informacion) 28 | txt_nombre.grid(row=1, column=0) 29 | 30 | contenedor.pack(expand=1, fill='both') 31 | 32 | def main(): 33 | app = tk.Tk() 34 | app.geometry('350x300') 35 | app.title('Pestañas') 36 | 37 | ventana = VentanaPrincipal(app) 38 | ventana.mainloop() 39 | 40 | if __name__ == "__main__": 41 | main() 42 | -------------------------------------------------------------------------------- /parte18/demo23_botones_colores.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaBotones(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | self.pack() 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | tk.Button(self, text='Azul', bg='blue').grid(row=0, column=0) 13 | tk.Button(self, text='Amarillo', bg='yellow').grid(row=1, column=0) 14 | tk.Button(self, text='Rojo', bg='red').grid(row=2, column=0) 15 | tk.Button(self, text='Verde', bg='green').grid(row=3, column=0) 16 | tk.Button(self, text='Blanco', bg='white').grid(row=4, column=0) 17 | 18 | tk.Button(self, text='#AF12BC', bg='#AF12BC').grid(row=5, column=0) 19 | 20 | def main(): 21 | app = tk.Tk() 22 | app.title('Colores para botones') 23 | app.geometry('350x300') 24 | 25 | ventana = VentanaBotones(app) 26 | ventana.mainloop() 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /parte18/demo24_cambio_color_boton.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaPrincipal(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | self.pack() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | btn_saludar = tk.Button(self, text='Saludar', bg='#FFF', activebackground='yellow') 14 | btn_saludar.pack() 15 | 16 | def main(): 17 | app = tk.Tk() 18 | app.title('Cambio color botón') 19 | app.geometry('300x300') 20 | 21 | ventana = VentanaPrincipal(app) 22 | ventana.mainloop() 23 | 24 | if __name__ == "__main__": 25 | main() 26 | -------------------------------------------------------------------------------- /parte18/demo25_colores_fondo.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaColores(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | 13 | frm_amarillo = tk.Frame(master=self.master, width=200, height=100, bg='#FCD116') 14 | frm_amarillo.pack(fill=tk.Y, side=tk.LEFT) 15 | 16 | frm_azul = tk.Frame(master=self.master, width=150, height=100, bg='#003893') 17 | frm_azul.pack(fill=tk.Y, side=tk.LEFT) 18 | 19 | frm_rojo = tk.Frame(master=self.master, width=100, height=100, bg='#CE1126') 20 | frm_rojo.pack(fill=tk.Y, side=tk.LEFT) 21 | 22 | def main(): 23 | app = tk.Tk() 24 | app.title('Colores Bandera Colombia') 25 | app.geometry('450x300') 26 | 27 | ventana = VentanaColores(app) 28 | ventana.mainloop() 29 | 30 | if __name__ == "__main__": 31 | main() 32 | -------------------------------------------------------------------------------- /parte18/demo26_bandera.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class Bandera(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | frm_amarillo = tk.Frame(master=self.master, width=450, height=300, bg='#FCD116') 13 | frm_amarillo.pack(fill=tk.BOTH, side=tk.TOP, expand=1) 14 | 15 | frm_azul = tk.Frame(master=self.master, width=450, height=150, bg='#003893') 16 | frm_azul.pack(fill=tk.BOTH, side=tk.TOP, expand=1) 17 | 18 | frm_rojo = tk.Frame(master=self.master, width=450, height=150, bg='#CE1126') 19 | frm_rojo.pack(fill=tk.BOTH, side=tk.TOP, expand=1) 20 | 21 | def main(): 22 | root = tk.Tk() 23 | root.title('Bandera Colombia') 24 | root.geometry('450x600') 25 | 26 | ventana = Bandera(root) 27 | ventana.mainloop() 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /parte18/demo27_grilla_grid.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class Tabla(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | for i in range(4): 13 | for j in range(4): 14 | celda = tk.Frame(master=self.master, relief=tk.RAISED, borderwidth=2) 15 | celda.grid(row=i, column=j) 16 | 17 | lbl_etiqueta = tk.Label(master=celda, text=f'Fila {i + 1}\nColumna {j + 1}') 18 | lbl_etiqueta.pack() 19 | 20 | def main(): 21 | app = tk.Tk() 22 | app.title('Organización Tabla') 23 | app.geometry('400x400') 24 | 25 | ventana = Tabla(app) 26 | ventana.mainloop() 27 | 28 | if __name__ == "__main__": 29 | main() 30 | -------------------------------------------------------------------------------- /parte18/demo28_grilla_grid_autoajustable.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | 4 | class TablaAutoajustable(tk.Frame): 5 | 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | self.master = master 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | for i in range(4): 14 | self.master.columnconfigure(i, weight=1, minsize=80) 15 | self.master.rowconfigure(i, weight=1, minsize=55) 16 | 17 | for j in range(4): 18 | celda = tk.Frame(master=self.master, relief=tk.RAISED, borderwidth=2) 19 | celda.grid(row=i, column=j, padx=5, pady=5) 20 | 21 | lbl_etiqueta = tk.Label(master=celda, text=f'Fila {i + 1}\nColumna {j + 1}') 22 | lbl_etiqueta.pack(padx=5, pady=5) 23 | 24 | def main(): 25 | app = tk.Tk() 26 | app.title('Organización Tabla') 27 | app.geometry('400x400') 28 | 29 | ventana = TablaAutoajustable(app) 30 | ventana.mainloop() 31 | 32 | if __name__ == "__main__": 33 | main() 34 | 35 | -------------------------------------------------------------------------------- /parte18/demo29_posicion_etiquetas_extremos_ventana.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaPrincipal(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.master.columnconfigure(0, minsize=300) 13 | self.master.rowconfigure([0, 1], minsize=150) 14 | 15 | lbl_etiqueta_x = tk.Label(text='X', font=('Arial', 23)) 16 | lbl_etiqueta_x.grid(row=0, column=0, sticky='ne') 17 | 18 | lbl_etiqueta_y = tk.Label(text='Y', font=('Arial', 23)) 19 | lbl_etiqueta_y.grid(row=1, column=0, sticky='sw') 20 | 21 | def main(): 22 | root = tk.Tk() 23 | root.title('Posición Etiquetas') 24 | root.geometry('300x300') 25 | 26 | ventana = VentanaPrincipal(root) 27 | ventana.mainloop() 28 | 29 | if __name__ == "__main__": 30 | main() 31 | -------------------------------------------------------------------------------- /parte18/demo30_botones_4_esquinas.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class UbicacionBotones(tk.Frame): 4 | 5 | def __init__(self, master=None): 6 | super().__init__(master) 7 | self.master = master 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.master.rowconfigure([0, 1], minsize=150) 13 | self.master.columnconfigure([0, 1], minsize=150) 14 | 15 | btn_a = tk.Button(text='A', font=('Arial', 23)) 16 | btn_a.grid(row=0, column=0, sticky='nw') 17 | 18 | btn_b = tk.Button(text='B', font=('Arial', 23)) 19 | btn_b.grid(row=0, column=1, stick='ne') 20 | 21 | btn_c = tk.Button(text='C', font=('Arial', 23)) 22 | btn_c.grid(row=1, column=0, stick='sw') 23 | 24 | btn_d = tk.Button(text='D', font=('Arial', 23)) 25 | btn_d.grid(row=1, column=1, stick='se') 26 | 27 | def main(): 28 | root = tk.Tk() 29 | root.title('Posición Botones') 30 | root.geometry('300x300') 31 | 32 | ventana = UbicacionBotones(root) 33 | ventana.mainloop() 34 | 35 | if __name__ == "__main__": 36 | main() 37 | -------------------------------------------------------------------------------- /parte18/demo34_deteccion_pulsacion_click.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class PulsacionBotonesMouse(): 4 | 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | self.master.bind('', self.click_principal) 12 | self.master.bind('', self.click_tercer_boton) 13 | self.master.bind('', self.click_secundario) 14 | 15 | def click_principal(self, evento): 16 | tk.Label(self.master, text='Botón principal').pack() 17 | 18 | def click_secundario(self, evento): 19 | tk.Label(self.master, text='Botón secundario').pack() 20 | 21 | def click_tercer_boton(self, evento): 22 | tk.Label(self.master, text='Tercer botón').pack() 23 | 24 | def main(): 25 | app = tk.Tk() 26 | app.title('Pulsación botones del mouse') 27 | app.geometry('400x700') 28 | 29 | ventana = PulsacionBotonesMouse(app) 30 | app.mainloop() 31 | 32 | if __name__ == "__main__": 33 | main() 34 | -------------------------------------------------------------------------------- /parte18/demo35_imagen.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VisualizacionImagen: 4 | 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | canvas = tk.Canvas(self.master, width=920, height=500) 12 | canvas.pack() 13 | 14 | img_logo_python = tk.PhotoImage(file='parte18/python-logo.png') 15 | canvas.create_image(0, 0, anchor=tk.NW, image=img_logo_python) 16 | canvas.image = img_logo_python 17 | 18 | def main(): 19 | root = tk.Tk() 20 | root.title('Logo Python') 21 | 22 | ventana = VisualizacionImagen(root) 23 | 24 | root.mainloop() 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /parte18/demo35_python_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo35_python_logo.jpg -------------------------------------------------------------------------------- /parte18/demo35_python_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo35_python_logo.png -------------------------------------------------------------------------------- /parte18/demo36_contador.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class Contador: 4 | 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | self.master.rowconfigure(0, minsize=50, weight=1) 12 | self.master.columnconfigure([0, 1, 2], minsize=50, weight=1) 13 | 14 | btn_reducir = tk.Button(self.master, text='-', command=self.reducir) 15 | btn_reducir.grid(row=0, column=0, sticky='nsew') 16 | 17 | self.lbl_contador = tk.Label(master=self.master, text='0') 18 | self.lbl_contador.grid(row=0, column=1) 19 | 20 | btn_aumentar = tk.Button(master=self.master, text='+', command=self.aumentar) 21 | btn_aumentar.grid(row=0, column=2, sticky='nsew') 22 | 23 | def reducir(self): 24 | valor = int(self.lbl_contador['text']) 25 | self.lbl_contador['text'] = f'{valor - 1}' 26 | 27 | def aumentar(self): 28 | valor = int(self.lbl_contador['text']) 29 | self.lbl_contador['text'] = f'{valor + 1}' 30 | 31 | def main(): 32 | root = tk.Tk() 33 | root.title('Controles Reducción/Aumento') 34 | root.geometry('300x100') 35 | 36 | contador = Contador(root) 37 | root.mainloop() 38 | 39 | if __name__ == "__main__": 40 | main() 41 | -------------------------------------------------------------------------------- /parte18/demo37_pil.py: -------------------------------------------------------------------------------- 1 | from PIL import Image 2 | 3 | img_logo_python = Image.open('parte18/demo35_python_logo.png') 4 | print(img_logo_python.format, img_logo_python.size, img_logo_python.mode) 5 | 6 | print() 7 | 8 | img_logo_python = Image.open('parte18/demo35_python_logo.jpg') 9 | print(img_logo_python.format, img_logo_python.size, img_logo_python.mode) 10 | -------------------------------------------------------------------------------- /parte18/demo39_cargar_imagenes.py: -------------------------------------------------------------------------------- 1 | from tkinter import * 2 | from PIL import Image, ImageTk 3 | from tkinter import filedialog 4 | 5 | class SelectorImagenes: 6 | 7 | def __init__(self, master): 8 | self.master = master 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | btn_seleccionar_imagen = Button(self.master, text='Seleccionar imagen...', command=self.seleccionar_imagen) 14 | btn_seleccionar_imagen.grid(row=0, columnspan=4) 15 | 16 | def seleccionar_imagen(self): 17 | archivo = filedialog.askopenfilename(filetypes=[('Archivos de imagen', '*.png')]) 18 | 19 | if archivo is not None: 20 | imagen = Image.open(archivo) 21 | 22 | imagen = imagen.resize((256, 256), Image.ANTIALIAS) 23 | 24 | imagen = ImageTk.PhotoImage(imagen) 25 | 26 | lbl_imagen = Label(self.master, image=imagen) 27 | lbl_imagen.image = imagen 28 | lbl_imagen.grid(row=2) 29 | 30 | def main(): 31 | master = Tk() 32 | master.title('Selector Imágenes') 33 | master.geometry('550x550') 34 | master.resizable(width=True, height=True) 35 | 36 | ventana = SelectorImagenes(master) 37 | master.mainloop() 38 | 39 | if __name__ == "__main__": 40 | main() 41 | -------------------------------------------------------------------------------- /parte18/demo42_contactos.txt: -------------------------------------------------------------------------------- 1 | julio@mail.co;Julio Ordoñez;1983/05/23 2 | angie@mail.co;Angie Romero;1993/03/05 3 | sonia@mail.co;Sonia Ramírez;1995/07/29 4 | -------------------------------------------------------------------------------- /parte18/demo44_circulo.py: -------------------------------------------------------------------------------- 1 | from tkinter import * 2 | 3 | class CirculoEscalado(Frame): 4 | 5 | def __init__(self): 6 | Frame.__init__(self) 7 | 8 | self.pack(expand=YES, fill=BOTH) 9 | self.master.title('Círculo - Escalado') 10 | self.master.geometry('220x280') 11 | 12 | self.sdr_escalado = Scale(self, from_=0, to=1000, orient=HORIZONTAL, command=self.escalar) 13 | self.sdr_escalado.pack(side=BOTTOM, fill=X) 14 | 15 | self.canvas = Canvas(self, bg='white') 16 | self.canvas.pack(expand=YES, fill=BOTH) 17 | 18 | def escalar(self, valor): 19 | posicion = int(valor) + 10 20 | self.canvas.delete('circulo') 21 | self.canvas.create_oval(10, 10, posicion, posicion, fill='yellow', tags='circulo') 22 | 23 | def main(): 24 | CirculoEscalado().mainloop() 25 | 26 | if __name__ == "__main__": 27 | main() 28 | -------------------------------------------------------------------------------- /parte18/demo47_ovalos.py: -------------------------------------------------------------------------------- 1 | from tkinter import Canvas, Frame, RAISED, Tk, X 2 | 3 | class Ovalos: 4 | def __init__(self, master): 5 | self.master = master 6 | 7 | self.inicializar_gui() 8 | 9 | def inicializar_gui(self): 10 | frm_principal = Frame(self.master, width=500, height=400, bd=1) 11 | frm_principal.pack() 12 | 13 | frm_canvas = Frame(frm_principal, bd=2, relief=RAISED) 14 | frm_canvas.pack(expand=1, fill=X, padx=5, pady=10) 15 | 16 | canvas = Canvas(frm_canvas, bg='white', height=100, width=340) 17 | canvas.pack() 18 | 19 | for i in range(25): 20 | canvas.create_oval(5 + (4 * i), 5 + (3 * i), 6 * i + 60, i + 60, fill='yellow') 21 | 22 | canvas.create_text(260, 80, text='Tkinter', font=('Arial', 11, 'bold')) 23 | 24 | frm_canvas.pack(expand=1, fill=X, padx=5, pady=10) 25 | 26 | def main(): 27 | master = Tk() 28 | master.title('Óvalos') 29 | 30 | ventana = Ovalos(master) 31 | 32 | master.mainloop() 33 | 34 | if __name__ == "__main__": 35 | main() 36 | -------------------------------------------------------------------------------- /parte18/demo48_eventos_canvas.py: -------------------------------------------------------------------------------- 1 | from tkinter import messagebox, Canvas, Tk 2 | 3 | class EventosCanvas: 4 | 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | canvas = Canvas(self.master, width=300, height=300) 12 | 13 | txt_click = canvas.create_text(130, 50, text='Click') 14 | txt_doble_click = canvas.create_text(130, 200, text='Doble click') 15 | 16 | canvas.tag_bind(txt_click, '', self.click) 17 | 18 | canvas.tag_bind(txt_doble_click, '', self.doble_click) 19 | 20 | canvas.pack() 21 | 22 | def click(self, evento): 23 | messagebox.showinfo('Mensaje', 'Se ha hecho click en un texto.') 24 | 25 | def doble_click(self, evento): 26 | messagebox.showinfo('Mensaje', 'Se ha hecho doble click en un texto.') 27 | 28 | def main(): 29 | master = Tk() 30 | master.title('Eventos Canvas') 31 | master.geometry('300x300') 32 | 33 | ventana = EventosCanvas(master) 34 | 35 | master.mainloop() 36 | 37 | if __name__ == "__main__": 38 | main() 39 | -------------------------------------------------------------------------------- /parte18/demo51_imagen_canvas.py: -------------------------------------------------------------------------------- 1 | from tkinter import Canvas, PhotoImage, Tk, BOTH, NW 2 | 3 | class DibujoImagen: 4 | 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | canvas = Canvas(self.master, bg='white', height=500, width=500) 12 | canvas.pack(fill=BOTH) 13 | 14 | imagen = PhotoImage(file='parte18/python-logo-black.png') 15 | 16 | canvas.create_image(2, 2, image=imagen, anchor=NW) 17 | canvas.image = imagen 18 | 19 | def main(): 20 | master = Tk() 21 | master.title('Dibujo Imagen') 22 | master.geometry('500x500') 23 | 24 | ventana = DibujoImagen(master) 25 | 26 | master.mainloop() 27 | 28 | if __name__ == '__main__': 29 | main() 30 | -------------------------------------------------------------------------------- /parte18/demo53_dialogo_color.py: -------------------------------------------------------------------------------- 1 | from tkinter import colorchooser, Button, Tk 2 | 3 | class SeleccionColor: 4 | 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | Button(self.master, text='Seleccionar color...', command=self.seleccionar_color).pack(expand=True) 12 | 13 | def seleccionar_color(self): 14 | colores = colorchooser.askcolor(title='Seleccione su color favorito...') 15 | 16 | self.master.configure(bg=colores[1]) 17 | 18 | def main(): 19 | master = Tk() 20 | master.title('Selección Color') 21 | master.geometry('300x300') 22 | 23 | ventana = SeleccionColor(master) 24 | 25 | master.mainloop() 26 | 27 | if __name__ == '__main__': 28 | main() 29 | -------------------------------------------------------------------------------- /parte18/demo54_barra_progreso.py: -------------------------------------------------------------------------------- 1 | from tkinter import E, W, Button, Tk 2 | from tkinter.ttk import Progressbar 3 | 4 | class Proceso: 5 | def __init__(self, master): 6 | self.master = master 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | pbr_proceso = Progressbar(self.master, orient='horizontal', mode='indeterminate', length=300) 12 | pbr_proceso.grid(column=0, row=0, columnspan=2, padx=10, pady=10) 13 | 14 | btn_iniciar = Button(self.master, text='Iniciar', command=pbr_proceso.start) 15 | btn_iniciar.grid(row=1, column=0, padx=10, pady=10, sticky=E) 16 | 17 | btn_detener = Button(self.master, text='Detener', command=pbr_proceso.stop) 18 | btn_detener.grid(row=1, column=1, padx=10, pady=10, sticky=W) 19 | 20 | 21 | def main(): 22 | master = Tk() 23 | master.title('Proceso') 24 | master.geometry('320x150') 25 | 26 | proceso = Proceso(master) 27 | 28 | master.mainloop() 29 | 30 | if __name__ == '__main__': 31 | main() 32 | -------------------------------------------------------------------------------- /parte18/demo57_ventana_pantallla_completa.py: -------------------------------------------------------------------------------- 1 | from tkinter import Tk 2 | 3 | class Aplicacion(Tk): 4 | def __init__(self): 5 | super().__init__() 6 | self.inicializar_gui() 7 | 8 | def inicializar_gui(self): 9 | self.title('Aplicación Pantalla Completa') 10 | self.attributes('-fullscreen', True) 11 | 12 | def main(): 13 | app = Aplicacion() 14 | app.mainloop() 15 | 16 | if __name__ == '__main__': 17 | main() 18 | -------------------------------------------------------------------------------- /parte18/demo58_area_texto_spinbox.py: -------------------------------------------------------------------------------- 1 | from tkinter import Tk, INSERT, WORD 2 | from tkinter import ttk 3 | from tkinter import scrolledtext 4 | 5 | class EntradaDatos(Tk): 6 | 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.title('Spinbox + ScrolledText') 14 | self.minsize(400, 400) 15 | 16 | self.spx_numero = ttk.Spinbox(self, from_=0, to=10, command=self.capturar_nuevo_valor) 17 | self.spx_numero.grid(column=0, row=1) 18 | 19 | self.txa_numeros = scrolledtext.ScrolledText(self, width=30, height=15, wrap=WORD) 20 | self.txa_numeros.grid(column=1, row=1) 21 | 22 | def capturar_nuevo_valor(self): 23 | valor = self.spx_numero.get() 24 | self.txa_numeros.insert(INSERT, valor) 25 | 26 | def main(): 27 | app = EntradaDatos() 28 | app.mainloop() 29 | 30 | if __name__ == '__main__': 31 | main() 32 | -------------------------------------------------------------------------------- /parte18/demo59_comentarios.txt: -------------------------------------------------------------------------------- 1 | John;johnortizo@outlook.com;ABC 2 | John;johnortizo@outlook.com;Este es un comentario. 3 | Oliva;oliva@mail.co;Nuevo comentario. 4 | -------------------------------------------------------------------------------- /parte18/demo63_uso_basico_requests.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | url = 'https://randomuser.me/api?format=json' 4 | 5 | try: 6 | respuesta = requests.get(url) 7 | 8 | if respuesta.status_code == 200: 9 | print('Código de respuesta:', respuesta.status_code) 10 | 11 | print() 12 | 13 | print('Contenido como cadena de bytes:') 14 | print(type(respuesta.content)) 15 | print(respuesta.content) 16 | 17 | print() 18 | print('Contenido en formato texto (str):') 19 | print(type(respuesta.text)) 20 | print(respuesta.text) 21 | 22 | print() 23 | 24 | print('Contenido en formato JSON:') 25 | contenido_json = respuesta.json() 26 | print(type(contenido_json)) 27 | print(contenido_json) 28 | 29 | print() 30 | 31 | print('Contenido de results:') 32 | print(type(contenido_json['results'])) # 33 | print(contenido_json['results']) 34 | print(contenido_json['results'][0]['gender']) # ~ 35 | print(contenido_json['results'][0]['name']['first']) # ~ 36 | 37 | print() 38 | else: 39 | print('No se ha encontrado el recurso.') 40 | except: 41 | print('La URL no existe') 42 | -------------------------------------------------------------------------------- /parte18/demo64_cielo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo64_cielo.jpg -------------------------------------------------------------------------------- /parte18/demo65_perfil.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo65_perfil.jpg -------------------------------------------------------------------------------- /parte18/demo65_perfil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo65_perfil.png -------------------------------------------------------------------------------- /parte18/demo66_componentes.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo66_componentes.db -------------------------------------------------------------------------------- /parte18/demo70_configuracion_botones.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | class VentanaPrincipal(tk.Tk): 4 | 5 | def __init__(self): 6 | super().__init__() 7 | 8 | self.inicializar_gui() 9 | 10 | def inicializar_gui(self): 11 | self.title('Configuración Botones') 12 | 13 | relieves = [tk.SUNKEN, tk.RAISED, tk.GROOVE, tk.RIDGE, tk.FLAT] 14 | 15 | self.botones = [self.crear_boton(r) for r in relieves] 16 | 17 | for b in self.botones: 18 | b.pack(padx=10, pady=10, side=tk.LEFT) 19 | 20 | def crear_boton(self, r): 21 | return tk.Button(self, text=r, relief=r) 22 | 23 | 24 | def main(): 25 | ventana = VentanaPrincipal() 26 | ventana.mainloop() 27 | 28 | 29 | if __name__ == '__main__': 30 | main() 31 | -------------------------------------------------------------------------------- /parte18/demo71_trastro_campo_texto_stringvar.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | 5 | class AplicacionStringVar(tk.Tk): 6 | 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.title('Uso de StringVar') 14 | self.geometry('200x200') 15 | 16 | self.nombre = tk.StringVar(self) 17 | 18 | self.txt_nombre = tk.Entry(self, textvariable=self.nombre) 19 | self.txt_nombre.pack() 20 | 21 | btn_mostrar_nombre = tk.Button(self, text='Mostrar nombre') 22 | btn_mostrar_nombre['command'] = self.mostrar_nombre 23 | btn_mostrar_nombre.pack() 24 | 25 | def mostrar_nombre(self): 26 | texto = self.nombre.get() 27 | 28 | messagebox.showinfo('Mensaje', f'Ud. ha escrito el nombre: {texto}') 29 | 30 | 31 | def main(): 32 | app = AplicacionStringVar() 33 | app.mainloop() 34 | 35 | 36 | if __name__ == '__main__': 37 | main() 38 | -------------------------------------------------------------------------------- /parte18/demo73_demo_uso_scale_spinbox.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | class SeleccionValoresNumericos(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.title('Selección Valores Numéricos') 13 | self.geometry('300x200') 14 | 15 | self.spx_edad = tk.Spinbox(self, from_=18, to=60) 16 | self.scl_puntos = tk.Scale(self, from_=0, to=100) 17 | 18 | btn_mostrar_valores = tk.Button(self, text='Mostrar valores') 19 | btn_mostrar_valores['command'] = self.mostrar_valores 20 | 21 | self.spx_edad.pack() 22 | self.scl_puntos.pack() 23 | btn_mostrar_valores.pack() 24 | 25 | def mostrar_valores(self): 26 | edad = int(self.spx_edad.get()) 27 | puntos = self.scl_puntos.get() 28 | 29 | messagebox.showinfo('Información', f'Su edad es: {edad}. Puntos: {puntos}') 30 | 31 | 32 | def main(): 33 | app = SeleccionValoresNumericos() 34 | app.mainloop() 35 | 36 | 37 | if __name__ == '__main__': 38 | main() 39 | -------------------------------------------------------------------------------- /parte18/demo74_seleccion_color.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | class SeleccionColor(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.title('Selección Color') 13 | self.geometry('300x300') 14 | 15 | self.color_seleccionado = tk.StringVar(self) 16 | self.color_seleccionado.set('rojo') 17 | 18 | colores = [('Rojo', 'rojo'), ('Verde', 'verde'), ('Azul', 'azul')] 19 | 20 | opciones_color = [self.crear_opcion(c) for c in colores] 21 | 22 | for o in opciones_color: 23 | o.pack() 24 | 25 | def crear_opcion(self, c): 26 | texto, valor = c 27 | 28 | return tk.Radiobutton(self, text=texto, value=valor, command=self.mostrar_seleccion, variable=self.color_seleccionado) 29 | 30 | def mostrar_seleccion(self): 31 | messagebox.showinfo('Mensaje', f'El color seleccionado es: {self.color_seleccionado.get()}') 32 | 33 | 34 | def main(): 35 | app = SeleccionColor() 36 | app.mainloop() 37 | 38 | 39 | if __name__ == '__main__': 40 | main() 41 | -------------------------------------------------------------------------------- /parte18/demo76_eventos_mouse_ventana.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from tkinter import messagebox 3 | 4 | 5 | class VentanaEventosMouse(tk.Tk): 6 | 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.title('Eventos Mouse sobre Ventana') 14 | self.geometry('400x400') 15 | 16 | frm_principal = tk.Frame(self, bg='green', height=400, width=400) 17 | 18 | frm_principal.bind('', self.mostrar_datos) 19 | frm_principal.bind('', self.mostrar_datos) 20 | frm_principal.bind('', self.mostrar_datos) 21 | frm_principal.bind('', self.mostrar_datos) 22 | # frm_principal.bind('', self.mostrar_datos) 23 | # frm_principal.bind('', self.mostrar_datos) 24 | 25 | frm_principal.pack(padx=50, pady=50) 26 | 27 | def mostrar_datos(self, evento): 28 | posicion = f'(x={evento.x}, y={evento.y})' 29 | 30 | mensaje = f'Nombre del evento: {evento.type} - Posición: {posicion}' 31 | 32 | messagebox.showinfo('Evento', mensaje) 33 | 34 | 35 | def main(): 36 | app = VentanaEventosMouse() 37 | app.mainloop() 38 | 39 | 40 | if __name__ == '__main__': 41 | main() 42 | -------------------------------------------------------------------------------- /parte18/demo77_eventos_teclado.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | 4 | class EventosTecladoApp(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.title('Eventos Teclado') 13 | self.geometry('400x400') 14 | 15 | txt_campo = tk.Entry(self) 16 | txt_campo.pack(padx=20, pady=20) 17 | 18 | txt_campo.bind('', self.mostrar_info_evento) 19 | txt_campo.bind('', self.mostrar_tecla_presionada) 20 | 21 | def mostrar_info_evento(self, evento): 22 | print('Info evento FocusIn') 23 | 24 | def mostrar_tecla_presionada(self, evento): 25 | datos = (evento.keysym, evento.keycode, evento.char) 26 | 27 | print(datos) 28 | 29 | 30 | def main(): 31 | app = EventosTecladoApp() 32 | app.mainloop() 33 | 34 | 35 | if __name__ == '__main__': 36 | main() 37 | -------------------------------------------------------------------------------- /parte18/demo78_icono.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo78_icono.ico -------------------------------------------------------------------------------- /parte18/demo78_icono_ventana.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | 4 | class VentanaIcono(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.title('Ventana con ícono') 13 | self.geometry('300x300') 14 | 15 | self.iconbitmap('parte18/demo78_icono.ico') 16 | 17 | 18 | def main(): 19 | app = VentanaIcono() 20 | app.mainloop() 21 | 22 | 23 | if __name__ == '__main__': 24 | main() 25 | -------------------------------------------------------------------------------- /parte18/demo80_organizacion_interfaz.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | 4 | class OrganizacionInterfaz(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.title('Organización Interfaz') 13 | self.geometry('350x350') 14 | 15 | lbl_amarillo = tk.Label(self, text='1', bg='yellow') 16 | lbl_blanco = tk.Label(self, text='2', bg='white') 17 | lbl_rojo = tk.Label(self, text='3', bg='red', fg='white') 18 | lbl_verde = tk.Label(self, text='4', bg='green', fg='white') 19 | lbl_azul = tk.Label(self, text='5', bg='blue', fg='white') 20 | 21 | opciones = {'fill': tk.BOTH, 'ipadx': 10, 'ipady': 10} 22 | 23 | lbl_amarillo.pack(side=tk.TOP, **opciones) 24 | lbl_blanco.pack(side=tk.TOP, **opciones) 25 | lbl_rojo.pack(side=tk.LEFT, expand=1, **opciones) 26 | lbl_verde.pack(side=tk.LEFT, expand=1, **opciones) 27 | lbl_azul.pack(side=tk.LEFT, expand=1, **opciones) 28 | 29 | 30 | def main(): 31 | app = OrganizacionInterfaz() 32 | app.mainloop() 33 | 34 | 35 | if __name__ == '__main__': 36 | main() 37 | -------------------------------------------------------------------------------- /parte18/demo82_formulario_registro.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | 4 | class FormularioRegistro(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | self.title('Formulario Registro') 13 | self.geometry('300x300') 14 | 15 | campos = ['Primer nombre', 'Primer apellido', 'Teléfono', 'Email'] 16 | lbl_campos = [tk.Label(self, text=c) for c in campos] 17 | txt_campos = [tk.Entry(self) for _ in campos] 18 | 19 | self.componentes = list(zip(lbl_campos, txt_campos)) 20 | 21 | btn_guardar = tk.Button(self, text='Guardar', command=self.guardar) 22 | 23 | for i, (lbl, txt) in enumerate(self.componentes): 24 | lbl.grid(row=i, column=0, padx=10, sticky=tk.W) 25 | txt.grid(row=i, column=1, padx=10, pady=5) 26 | 27 | btn_guardar.grid(row=len(self.componentes), column=1, sticky=tk.E, padx=10, pady=10) 28 | 29 | def guardar(self): 30 | for lbl, txt in self.componentes: 31 | print(f'{lbl.cget("text")} = {txt.get()}') 32 | 33 | 34 | def main(): 35 | app = FormularioRegistro() 36 | app.mainloop() 37 | 38 | 39 | if __name__ == '__main__': 40 | main() 41 | -------------------------------------------------------------------------------- /parte18/demo89_mensajes_confirmacion.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | import tkinter.messagebox as mb 3 | 4 | 5 | class Aplicacion(tk.Tk): 6 | 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.title('Diálogos de Confirmación') 14 | self.geometry('350x250') 15 | 16 | self.crear_boton(mb.askyesno, 'Confirmación Sí/No', 'Respuesta Sí/No') 17 | self.crear_boton(mb.askquestion, 'Confirmación Pregunta', 'Respuesta Pregunta') 18 | self.crear_boton(mb.askokcancel, 'Confirmación OK/Cancelar', 'Respuesta OK/Cancelar') 19 | self.crear_boton(mb.askretrycancel, 'Confirmación Reintentar/Cancelar', 'Respuesta Reintentar/Cancelar') 20 | self.crear_boton(mb.askyesnocancel, 'Confirmación Sí/No/Cancelar', 'Respuesta Sí/No/Cancelar') 21 | 22 | def crear_boton(self, tipo_dialogo, titulo, mensaje): 23 | comando = lambda: print(tipo_dialogo(titulo, mensaje)) 24 | btn_comando = tk.Button(self, text=titulo, command=comando) 25 | btn_comando.pack(padx=40, pady=5, expand=True, fill=tk.BOTH) 26 | 27 | 28 | def main(): 29 | app = Aplicacion() 30 | app.mainloop() 31 | 32 | 33 | if __name__ == '__main__': 34 | main() 35 | -------------------------------------------------------------------------------- /parte18/demo91_guardar_contenido.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | import tkinter.filedialog as fd 3 | 4 | 5 | class AlmacenamientoContenido(tk.Tk): 6 | 7 | def __init__(self): 8 | super().__init__() 9 | 10 | self.inicializar_gui() 11 | 12 | def inicializar_gui(self): 13 | self.title('Almacenamiento contenido') 14 | self.geometry('300x300') 15 | 16 | self.txt_contenido = tk.Text(self, height=12, width=60) 17 | 18 | btn_guardar_contenido = tk.Button(self, text='Guardar...') 19 | btn_guardar_contenido['command'] = self.guardar_contenido 20 | 21 | self.txt_contenido.pack() 22 | btn_guardar_contenido.pack(pady=10, ipadx=5) 23 | 24 | def guardar_contenido(self): 25 | nuevo_archivo = fd.asksaveasfile(title='Guardar archivo...', 26 | defaultextension='.txt', 27 | filetypes=(('Text files', '*.txt'),)) 28 | 29 | if nuevo_archivo: 30 | contenido = self.txt_contenido.get(1.0, tk.END) 31 | 32 | nuevo_archivo.write(contenido) 33 | nuevo_archivo.close() 34 | 35 | 36 | def main(): 37 | app = AlmacenamientoContenido() 38 | app.mainloop() 39 | 40 | 41 | if __name__ == '__main__': 42 | main() 43 | -------------------------------------------------------------------------------- /parte18/demo91_python.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo91_python.txt -------------------------------------------------------------------------------- /parte18/demo92_barra_menu.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | 3 | 4 | class AplicacionBarraMenu(tk.Tk): 5 | 6 | def __init__(self): 7 | super().__init__() 8 | 9 | self.inicializar_gui() 10 | 11 | def inicializar_gui(self): 12 | mnu_principal = tk.Menu(self) 13 | mnu_archivo = tk.Menu(mnu_principal, tearoff=0) 14 | 15 | mnu_archivo.add_command(label='Nuevo archivo') 16 | mnu_archivo.add_command(label='Abrir') 17 | mnu_archivo.add_separator() 18 | mnu_archivo.add_command(label='Guardar') 19 | mnu_archivo.add_command(label='Guardar como...') 20 | 21 | mnu_principal.add_cascade(label='Archivo', menu=mnu_archivo) 22 | mnu_principal.add_command(label='Acerca de') 23 | mnu_principal.add_command(label='Salir', command=self.destroy) 24 | 25 | self.config(menu=mnu_principal) 26 | 27 | 28 | def main(): 29 | app = AplicacionBarraMenu() 30 | app.mainloop() 31 | 32 | 33 | if __name__ == '__main__': 34 | main() 35 | -------------------------------------------------------------------------------- /parte18/demo95_contactos.csv: -------------------------------------------------------------------------------- 1 | Palacios,Sonia,sonia@mail.co,3201234567 2 | Edgar,Meneses,edgar@mail.co,321654820 3 | Daniela,Salas,danny@mail.co,301565879 4 | Mauricio,Torres,mauricio@mail.co,3095467892 5 | Artunduaga,María,mariau@mail.co,3136548522 6 | Tovar,Juan,juan@mail.co,3218529632 7 | Rodríguez,Alexander,alex@mail.co,3218524952 8 | -------------------------------------------------------------------------------- /parte18/demo96_contactos.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/demo96_contactos.db -------------------------------------------------------------------------------- /parte18/demo96_migracion_datos.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import sqlite3 3 | from sqlite3.dbapi2 import connect 4 | 5 | 6 | def main(): 7 | with open('parte18/demo95_contactos.csv') as f, \ 8 | sqlite3.connect('parte18/demo96_contactos.db') as conexion: 9 | 10 | conexion.execute(""" 11 | CREATE TABLE contacto ( 12 | apellidos TEXT, 13 | nombres TEXT, 14 | email TEXT, 15 | telefono TEXT 16 | ); 17 | """) 18 | 19 | conexion.executemany('INSERT INTO contacto VALUES (?, ?, ?, ?)', csv.reader(f)) 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /parte18/demo97_descargador_html.py: -------------------------------------------------------------------------------- 1 | import tkinter as tk 2 | from urllib.request import urlopen 3 | 4 | 5 | class DescargadorHTML(tk.Frame): 6 | def __init__(self, master=None): 7 | super().__init__(master) 8 | self.master = master 9 | self.pack() 10 | 11 | self.inicializar_gui() 12 | 13 | def inicializar_gui(self): 14 | self.lbl_url = tk.Label(self, text='Dirección URL:') 15 | self.lbl_url.pack(side='top') 16 | 17 | self.txt_url = tk.Entry(self) 18 | self.txt_url.pack(side='top') 19 | 20 | self.btn_descargar = tk.Button(self, text='Descargar HTML', command=self.descargar_html) 21 | self.btn_descargar.pack(side='bottom') 22 | 23 | self.txa_contenido_html = tk.Text(self, height=20, width=20) 24 | self.txa_contenido_html.pack(side='bottom') 25 | 26 | def descargar_html(self): 27 | url = self.txt_url.get() 28 | 29 | html = urlopen(url).read().decode() 30 | self.txa_contenido_html.delete('1.0', 'end') 31 | self.txa_contenido_html.insert('end', html) 32 | 33 | 34 | if __name__ == '__main__': 35 | root = tk.Tk() 36 | app = DescargadorHTML(master=root) 37 | app.mainloop() 38 | -------------------------------------------------------------------------------- /parte18/demo99_extra.py: -------------------------------------------------------------------------------- 1 | from tkinter import ttk 2 | import tkinter as tk 3 | 4 | ID = [1,2,3,4,5, 6, 7, 8, 9] 5 | Names = ['Tom', 'Rob', 'Tim', 'Jim', 'Kim', 'Kim', 'Kim', 'Kim'] 6 | 7 | window = tk.Tk() 8 | 9 | treev = ttk.Treeview(window, selectmode ='browse') 10 | treev.pack(side='left',expand=True, fill='both') 11 | 12 | 13 | verscrlbar = ttk.Scrollbar(window, 14 | orient ="vertical", 15 | command = treev.yview) 16 | 17 | verscrlbar.pack(side ='right', fill ='y') 18 | treev.configure(yscrollcommand = verscrlbar.set) 19 | 20 | 21 | treev["columns"] = ('1', '2') 22 | 23 | treev['show'] = 'headings' 24 | 25 | treev.column("1", width = 90, anchor ='c') 26 | treev.column("2", width = 90, anchor ='c') 27 | 28 | 29 | treev.heading("1", text ="ID") 30 | treev.heading("2", text ="Names") 31 | 32 | for x, y in zip(ID, Names): 33 | treev.insert("", 'end', values =(x, y)) 34 | 35 | window.mainloop() -------------------------------------------------------------------------------- /parte18/productos.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/productos.db -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/__init__.py: -------------------------------------------------------------------------------- 1 | # Incorporación o inclusión de otros módulos. -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/exportados/inventario-20230525.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/proyecto0/inventario/exportados/inventario-20230525.xlsx -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/exportados/productos-20230524.csv: -------------------------------------------------------------------------------- 1 | Código,Nombre,Precio,Cantidad,Disponible 2 | 1,Monitor,300000.0,100,Sí 3 | 2,Mouse,150000.0,200,Sí 4 | 3,Parlantes gamer,350000.0,100,Sí 5 | 4,Deademas,150000.0,150,Sí 6 | -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/exportados/ventas-20230524.csv: -------------------------------------------------------------------------------- 1 | Código Producto,Cantidad,Total sin IVA,Fecha 2 | 1,5,1500000.0,22/05/2023 3 | 4,20,3000000.0,22/05/2023 4 | 1,1,300000.0,22/05/2023 5 | 3,10,3500000.0,22/05/2023 6 | 2,160,24000000.0,23/05/2023 7 | -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/inventario.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/proyecto0/inventario/inventario.pickle -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/proyecto0/inventario/modelos/__init__.py -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/modelos/producto.py: -------------------------------------------------------------------------------- 1 | class Producto: 2 | def __init__(self, codigo, nombre, precio, cantidad, disponible): 3 | self.codigo = codigo 4 | self.nombre = nombre 5 | self.precio = precio 6 | self.cantidad = cantidad 7 | self.disponible = disponible 8 | 9 | def __str__(self): 10 | return f'ID: {self.codigo}\nNombre: {self.nombre}\nPrecio: {self.precio}\nCantidad: {self.cantidad}\n¿Disponible?: {"Sí" if self.disponible else "No"}' 11 | -------------------------------------------------------------------------------- /parte18/proyecto0/inventario/modelos/venta.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | class Venta: 4 | def __init__(self, codigo_producto, cantidad, total_sin_iva, fecha=datetime.now()): 5 | self.codigo_producto = codigo_producto 6 | self.fecha = fecha 7 | self.cantidad = cantidad 8 | self.total_sin_iva = total_sin_iva 9 | -------------------------------------------------------------------------------- /parte18/proyecto0/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='inventario', version='1.0.0', packages=['inventario'], 4 | entry_points= { 5 | 'console_scripts': ['inventario = inventario.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte18/python-logo-black.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/python-logo-black.gif -------------------------------------------------------------------------------- /parte18/python-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/python-logo-black.png -------------------------------------------------------------------------------- /parte18/python-logo-file-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/python-logo-file-black.png -------------------------------------------------------------------------------- /parte18/python-logo-name-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/python-logo-name-black.png -------------------------------------------------------------------------------- /parte18/python-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte18/python-logo.png -------------------------------------------------------------------------------- /parte19_proyecto1_scraping/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte19_proyecto1_scraping/__init__.py -------------------------------------------------------------------------------- /parte19_proyecto1_scraping/demo_beautifulsoup.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | 4 | # Definir la URL de la página web 5 | url = "https://www.example.com" 6 | 7 | # Enviar una solicitud GET a la URL 8 | response = requests.get(url) 9 | 10 | # Crear un objeto BeautifulSoup con el contenido de la respuesta 11 | soup = BeautifulSoup(response.content, "html.parser") 12 | 13 | # Imprimir el HTML completo de la página 14 | print(soup.prettify()) 15 | -------------------------------------------------------------------------------- /parte19_proyecto1_scraping/demo_flet.py: -------------------------------------------------------------------------------- 1 | import flet as ft 2 | 3 | 4 | def main(page: ft.Page): 5 | page.title = "Flet counter example" 6 | page.vertical_alignment = ft.MainAxisAlignment.CENTER 7 | 8 | txt_number = ft.TextField(value="0", text_align=ft.TextAlign.RIGHT, width=100) 9 | 10 | def minus_click(e): 11 | txt_number.value = str(int(txt_number.value) - 1) 12 | page.update() 13 | 14 | def plus_click(e): 15 | txt_number.value = str(int(txt_number.value) + 1) 16 | page.update() 17 | 18 | page.add( 19 | ft.Row( 20 | [ 21 | ft.IconButton(ft.icons.REMOVE, on_click=minus_click), 22 | txt_number, 23 | ft.IconButton(ft.icons.ADD, on_click=plus_click), 24 | ], 25 | alignment=ft.MainAxisAlignment.CENTER, 26 | ) 27 | ) 28 | 29 | ft.app(target=main) 30 | -------------------------------------------------------------------------------- /parte19_proyecto1_scraping/tabla.csv: -------------------------------------------------------------------------------- 1 | Celda 1,Celda 2,Celda 3 2 | Celda 4,Celda 5,Celda 6 3 | -------------------------------------------------------------------------------- /parte19_proyecto1_scraping/tabla_1.csv: -------------------------------------------------------------------------------- 1 | Celda 1,Celda 2,Celda 3 2 | Celda 4,Celda 5,Celda 6 3 | -------------------------------------------------------------------------------- /parte19_proyecto1_scraping/tabla_2.csv: -------------------------------------------------------------------------------- 1 | Hoy,Mañana,Lunes 2 | Soleado,Mayormente soleado,Parcialmente nublado 3 | 19°C,17°C,12°C 4 | E 13 km/h,E 11 km/h,S 16 km/h 5 | -------------------------------------------------------------------------------- /parte20_inventario_flet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte20_inventario_flet/__init__.py -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/__init__.py: -------------------------------------------------------------------------------- 1 | # Incorporación o inclusión de otros módulos. -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/conexion.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | 4 | def conectar(nombre_archivo_bd): 5 | """ 6 | Crea una conexión con la base de datos. 7 | 8 | Parameters: 9 | nombre_archivo_bd: nombre del archivo de la base de datos. 10 | 11 | Returns: 12 | Conexión con la base de datos. 13 | """ 14 | conexion = sqlite3.connect(nombre_archivo_bd) 15 | conexion.row_factory = sqlite3.Row 16 | 17 | return conexion 18 | -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/exportados/inventario-20230525.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte20_inventario_flet/inventario/exportados/inventario-20230525.xlsx -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/exportados/productos-20230524.csv: -------------------------------------------------------------------------------- 1 | Código,Nombre,Precio,Cantidad,Disponible 2 | 1,Monitor,300000.0,100,Sí 3 | 2,Mouse,150000.0,200,Sí 4 | 3,Parlantes gamer,350000.0,100,Sí 5 | 4,Deademas,150000.0,150,Sí 6 | -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/exportados/ventas-20230524.csv: -------------------------------------------------------------------------------- 1 | Código Producto,Cantidad,Total sin IVA,Fecha 2 | 1,5,1500000.0,22/05/2023 3 | 4,20,3000000.0,22/05/2023 4 | 1,1,300000.0,22/05/2023 5 | 3,10,3500000.0,22/05/2023 6 | 2,160,24000000.0,23/05/2023 7 | -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/inventario.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte20_inventario_flet/inventario/inventario.db -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/modelos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte20_inventario_flet/inventario/modelos/__init__.py -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/modelos/producto.py: -------------------------------------------------------------------------------- 1 | class Producto: 2 | """ 3 | Representa un producto del inventario. 4 | """ 5 | def __init__(self, codigo, nombre, precio, cantidad, disponible): 6 | """ 7 | Constructor de la clase. 8 | 9 | Parameters: 10 | codigo: Código del producto. 11 | nombre: Nombre del producto. 12 | precio: Precio del producto. 13 | cantidad: Cantidad del producto. 14 | disponible: ¿Está disponible el producto? 15 | """ 16 | 17 | self.codigo = codigo 18 | self.nombre = nombre 19 | self.precio = precio 20 | self.cantidad = cantidad 21 | self.disponible = disponible 22 | 23 | def __str__(self): 24 | """ 25 | Representación en cadena de texto del producto. 26 | 27 | Returns: 28 | Representación en cadena de texto del producto. 29 | """ 30 | return f'ID: {self.codigo}\nNombre: {self.nombre}\nPrecio: {self.precio}\nCantidad: {self.cantidad}\n¿Disponible?: {"Sí" if self.disponible else "No"}' 31 | -------------------------------------------------------------------------------- /parte20_inventario_flet/inventario/modelos/venta.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | class Venta: 4 | """ 5 | Representa una venta realizada. 6 | """ 7 | def __init__(self, codigo_producto, cantidad, total_sin_iva, fecha=datetime.now()): 8 | """ 9 | Constructor de la clase. 10 | 11 | Parameters: 12 | codigo_producto: Código del producto. 13 | fecha: Fecha de la venta. 14 | cantidad: Cantidad del producto. 15 | total_sin_iva: Total sin IVA de la venta. 16 | """ 17 | self.codigo_producto = codigo_producto 18 | self.fecha = fecha 19 | self.cantidad = cantidad 20 | self.total_sin_iva = total_sin_iva 21 | 22 | def __str__(self): 23 | """ 24 | Representación en cadena de texto de la venta. 25 | 26 | Returns: 27 | Representación en cadena de texto de la venta. 28 | """ 29 | return f'Código del producto: {self.codigo_producto}\nFecha: {self.fecha}\nCantidad: {self.cantidad}\nTotal sin IVA: {self.total_sin_iva}' 30 | -------------------------------------------------------------------------------- /parte20_inventario_flet/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup(name='inventario', version='1.0.0', packages=['inventario'], 4 | entry_points= { 5 | 'console_scripts': ['inventario = inventario.__main__:main'] 6 | }) 7 | -------------------------------------------------------------------------------- /parte21_intro_base_datos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/parte21_intro_base_datos/__init__.py -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Fhernd/Python-CursoV2/1ce30162d4335945227f7cbb875f99bc5f682b98/requirements.txt --------------------------------------------------------------------------------