├── .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 |
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 |
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 |
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 |
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 |
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 |
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
--------------------------------------------------------------------------------