Este documento presenta un taller sobre listas y ventanas con el módulo Easygui en Python. Explica conceptos básicos sobre listas como crear, modificar y recorrer listas, y también presenta las principales funciones de Easygui para generar ventanas de diálogo, entrada de texto y selección de opciones.
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
Listas y ventanas EasyGUI
1. TALLER LISTAS Y VENTANAS CON EASYGUI
Resumen talleres anteriores
En el taller de gráficos tortuga, se dio una noción intuitiva del concepto de subrutina y
función de Python. En ciertos momentos un programador puede necesitar efectuar una
misma tarea en distintos puntos del programa o repetirla un cierto número de veces.
Para evitar tener que volver a escribir una y otra vez las mismas instrucciones, Python
permiten agrupar porciones de programa y reutilizarlas cuando sea necesario utilizando la
palabra clave def.
En los gráficos tortuga, puede ser tedioso escribir las instrucciones para dibujar un
cuadrado cada vez que se necesite, utilizando la palabra clave def se puede construir un
procedimiento que dibuje un cuadrado y llamarlo por su nombre cada vez que sea
necesario.
El siguiente ejemplo dibuja un cuadrado 2 veces, separado cierta distancia:
Note la diferencia entre la definición del procedimiento y su llamada.
El bloque def y las instrucciones que están bajo 4 espacios equivalen a la definición y
dibuja_cuadrado() es la llamada al procedimiento.
No es obligatorio, pero es deseable ubicar las definiciones y las llamadas de la siguiente
manera:
2. En las primeras líneas los módulos que necesita el programa, posteriormente las
definiciones y por último el programa principal o las llamadas a los procedimientos o
funciones.
Como lo muestra la figura anterior se hace una distinción conceptual entre procedimiento y
función la diferencia entre los dos radica en que el procedimiento no tiene la palabra clave
return mientras que una función si.
Técnicamente el procedimiento ejecuta ciertas instrucciones pero no devuelve un resultado
procesado al programa, en cambio la función devuelve un resultado al programa mediante
la palabra clave return
El código siguiente muestra las diferencias entre procedimientos y funciones:
3. Listas y Tuplas
Tuplas
Son tipos de datos inmutables eso quiere decir que una vez definidos no se pueden
modificar,
Las operaciones de las listas son aplicables a las tuplas menos las que impliquen
modificiones (agregar, insertar, modificar o eliminar elementos).
Se definen con paréntesis separados por comas
Ejemplo:
numeros_digitos=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
El resto del taller se dedicará en su mayoría a las listas.
Listas
Las listas son conjuntos ordenados de elementos (números, cadenas, listas, etc).
Las listas se delimitan por corchetes ([ ]) y los elementos se separan por comas.
Las listas pueden contener elementos del mismo tipo, por ejemplo:
primos = [2, 3, 5, 7, 11, 13]
dias_laborables = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]
Pueden contener elementos de tipos distintos:
fecha = ["Lunes", 27, "Octubre", 1997]
O pueden contener a otras listas:
dias_de_la_semana = [ ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"] , ["Sabado",
"Domingo"]]
Es posible acceder a cada uno de los elementos por medio de un índice que va desde 0
hasta el número de elementos.
La lista vacía se define por [ ]
4. Operaciones con listas
Imprimir por pantalla un elemento de la lista
nombres = ["Pedro", "Juan", "Carlos"]
print(nombres[2])
La salida por pantalla es:
Carlos
Modificar un elemento
nombres = ["Pedro", "Juan", "Carlos"]
nombres[0]= "Luis"
print(nombres)
La salida por pantalla es:
['Luis', 'Juan', 'Carlos']
Agregar elementos al final
nombres = ["Pedro", "Juan", "Carlos"]
nombres.append("Maria")
print(nombres)
La salida por pantalla es:
['Luis', 'Juan', 'Carlos', 'Maria']
Agregar elementos en una posición específica
nombres = ["Pedro", "Juan", "Carlos"]
nombres.insert(1,"Sara")
print(nombres)
La salida por pantalla es:
['Pedro', 'Sara', 'Juan', 'Carlos']
nombres = ["Pedro", "Juan", "Carlos"]
nombres.insert(2,"Juliana")
print(nombres)
La salida por pantalla es:
['Pedro', 'Juan', 'Juliana', 'Carlos']
5. Borrar un índice específico
nombres = ["Pedro", "Juan", "Carlos"]
del nombres[2]
print(nombres)
La salida por pantalla es:
['Pedro', 'Juan']
Saber si un valor está o no en una lista
Para saber si un valor está en una lista se puede utilizar el operador in. La sintaxis sería
"elemento in lista" y devuelve un valor lógico: True si el elemento está en la lista, False si el
elemento no está en la lista.
Por ejemplo, el programa siguiente comprueba si el usuario es una persona autorizada:
personas_autorizadas = ["Alberto", "Carmen"]
nombre = input("Dígame su nombre: ")
if nombre in personas_autorizadas:
print("Está autorizado")
else:
print("No está autorizado")
Para saber si un valor no está en una lista se pueden utilizar los operadores not in. La
sintaxis sería "elemento not in lista" y devuelve un valor lógico: True si el elemento no está
en la lista, False si el elemento está en la lista.
Por ejemplo, el programa siguiente comprueba si el usuario es una persona autorizada:
personas_autorizadas = ["Alberto", "Carmen"]
nombre = input("Dígame su nombre: ")
if nombre not in personas_autorizadas:
print("No está autorizado")
else:
print("Está autorizado")
Para averiguar la posición de un valor dentro de una lista
Se usa la operación index()
Ejemplo:
dias_laborables = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]
print(dias_laborables.index("Jueves"))
La salida por pantalla es:
3
6. Si el elemento no existe devuelve un error por lo cual es necesario verificar con antelación si
el elemento existe con la palabra clave in
Obtener el numero de elementos de una lista
Se utiliza la palabra clave len
Por ejemplo:
dias_laborables = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]
tamano=len(dias_laborables)
print(tamano)
La salida por pantalla es:
5
Obtener el mínimo valor entre los elementos de una lista
Se utiliza la palabra clave min
Por ejemplo:
numeros_primos = [3,7,5,1]
minimo=min(numeros_primos)
print(minimo)
La salida por pantalla es:
1
Obtener el máximo valor entre los elementos de una lista
Se utiliza la palabra clave max
Por ejemplo:
numeros_primos = [3,7,5,1]
maximo=max(numeros_primos)
print(maximo)
La salida por pantalla es:
7
Invertir el orden de una lista
Se utiliza la palabra clave reverse
Por ejemplo:
numeros_primos = [3,7,5,1]
numeros_primos.reverse()
print(numeros_primos)
7. La salida por pantalla es:
[1, 5, 7, 3]
Ordenar los elementos de una lista en forma ascendente
Se utiliza la propiedad sort
Por ejemplo:
numeros_primos = [3,7,5,1]
numeros_primos.sort()
print(numeros_primos)
La salida por pantalla es:
[1, 3, 5, 7]
Ordenar los elementos de una lista en forma descendente
Se utiliza la propiedad sort con el parámetro (reverse=True)
Por ejemplo:
numeros_primos = [3,7,5,1]
numeros_primos.sort(reverse=True)
print(numeros_primos)
La salida por pantalla es:
[7, 5, 3, 1]
Recorrer los elementos de una lista
Forma directa
dias_laborables = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]
for dia in dias_laborables:
print(dia)
La salida por pantalla es:
Lunes
Martes
Miercoles
Jueves
Viernes
8. Forma indirecta
dias_laborables = ["Lunes", "Martes", "Miercoles", "Jueves", "Viernes"]
i=0
while i<len(dias_laborables):
print(dias_laborables[i])
i=i+1
La salida por pantalla es:
Lunes
Martes
Miercoles
Jueves
Viernes
Extraer sublistas
Se puede extraer parte de una lista utilizando la notación nombre_lista[inicio : fin+1] por
ejemplo:
lista1 = ["A", "B", "C", "D", "E"]
print(lista1[0:3])
La salida por pantalla es:
['A', 'B', 'C']
y
print(lista1[:])
La salida por pantalla es:
['A', 'B', 'C', 'D', 'E']
Que equivale a todos los elementos de la lista.
Concatenar dos listas
Las listas se concatenan mediante el operador + siempre y cuando sean dos listas
El siguiente programa define dos listas una con dias_laborables y otra con dias_
no_laborables y las concatena en una nueva lista denominada dias_de_la_semana observe
que la lista resultante se puede imprimir usando la función print:
9. EASYGUI
Easygui es un módulo para python que permite generar ventanas mediante llamadas
simples a funciones.
Easygui no se encuentra disponible directamente en python, es necesario instalarlo para
que funcione. La versión de pyzo que se encuentra en la página del curso ya lo tiene en
funcionamiento, para que otros entornos de python revise su instalación en la siguiente
dirección
http://easygui.sourceforge.net/sourceforge_site_as_of_2014_11_21/download/version_0.9
6/index.html.
Para nuestro caso basta con descargar el pyzo de la página del curso, descomprimir e
importar al inicio del programa, así:
from easygui import *
Métodos principales de Easygui
Otras funcionalidades pueden ser consultadas en la siguiente enlace (en inglés):
http://easygui.sourceforge.net/tutorial.html
Mostar una ventana con un mensaje simple
Muestra un cuadro de dialogo con un mensaje
mensaje cadena de caracteres que aparece en el centro del cuadro de dialogo antes del
cuadro de texto
titulo título de la ventana
texto_boton es el texto que será mostrado en el botón
msgbox(mensaje, titulo, texto_boton)
El siguiente ejemplo muestra un simple cuadro de dialogo:
10. from easygui import *
mensaje="Mensaje"
titulo="Titulo"
texto_boton="Aceptar"
msgbox(mensaje, titulo, texto_boton)
Mostar una ventana con un texto específico o una lista
textbox(mensaje, titulo, texto)
mensaje cadena de caracteres que aparece en el centro del cuadro de dialogo antes del
cuadro de texto
titulo título de la ventana
texto puede ser un valor de tipo texto o una lista y constituye lo que se quiere mostrar
El siguiente ejemplo muestra la siguiente ventana:
from easygui import *
titulo="Titulo"
mensaje="Mensaje"
texto="Hola mundo"
textbox(mensaje, titulo, texto)
Ventana que solicita al usuario una cadena de caracteres
mensaje cadena de caracteres que aparece en el centro del cuadro de dialogo antes del
cuadro de texto
titulo título de la ventana
valor_inicial es una cadena de caracteres que se muestra por defecto en el cajón de texto
11. texto=enterbox(mensaje, titulo, valor_inicial)
El siguiente ejemplo muestra una ventana que solicita al usuario una cadena de caracteres y
el resultado lo almacena en la variable texto.
from easygui import *
titulo="Titulo"
mensaje="Mensaje"
valor_inicial="Ingrese una cadena por favor"
texto=enterbox(mensaje, titulo, valor_inicial)
Los valores ingresados por el usuario son almacenados en la variable texto que puede ser
definida con cualquier nombre y posteriormente usada en el transcurso del programa.
Ventana que solicita un número entero al usuario
Muestra un mensaje para que el usuario ingrese un número entero
mensaje cadena de caracteres que aparece en el centro del cuadro de dialogo antes del
cuadro de texto
titulo título de la ventana
valor_inicial es un número entero que se muestra por defecto
limite_inferior es el menor número entero que será aceptado
limite_superior es el mayor número entero que será aceptado
entero=integerbox(mensaje, titulo,valor_inicial, limite_inferior, limite_superior)
La ventana se mostrará repetidamente hasta que el usuario ingrese el valor correcto
El siguiente ejemplo muestra una ventana que solicita al usuario un número entero entre 1
y 50 como valor inicial pone 0 en el cuadro de dialogo.
El valor resultante se almacena en la variable entero.
12. from easygui import *
titulo="Titulo"
mensaje="Mensaje"
valor_inicial=0
limite_inferior=1
limite_superior=50
entero=integerbox(mensaje, titulo, valor_inicial, limite_inferior, limite_superior)
Ventana Si – No
Muestra un cuadro de dialogo con dos botones (cuyo título se puede definir) y devuelve 1 o
0 según la elección del usuario.
mensaje cadena de caracteres que aparece en el centro del cuadro de dialogo antes del
cuadro de texto
titulo título de la ventana
La tupla ("Si","No") se puede modificar para que los títulos de los botones tengan la
apariencia que el programador desee
ynbox(mensaje, titulo,("Si","No"))
El siguiente código muestra un cuadro de dialogo y según la elección del usuario imprime
por pantalla “Eligió aceptar” o “Eligió cancelar” según el caso
from easygui import *
mensaje = "¿Desea continuar?"
titulo = "Porfavor confirme"
if ynbox(mensaje, titulo,("Si","No"))==1 :
#Acciones si el usuario elije si
print("Eligio aceptar")
else:
#Acciones si el usuario elije no
print("Eligio cancelar")
13. El siguiente código hace lo mismo que el anterior solo que no se el resultado de ynbox no
se compara con 1
from easygui import *
mensaje = "¿Desea continuar?"
titulo = "Porfavor confirme"
if ynbox(mensaje, titulo,("Si","No")):
#Acciones si el usuario elije si
print("Eligio aceptar")
else:
#Acciones si el usuario elije no
print("Eligio cancelar")
Ventana de selección
Muestra una ventana con una lista de opciones de las cuales el usuario puede elegir una, su
acción se ejecuta cuando oprime el botón aceptar.
mensaje cadena de caracteres que aparece en el centro del cuadro de dialogo antes del
cuadro de texto
titulo título de la ventana
lista_opciones es una lista que contiene los textos de las diferentes opciones
choicebox(mensaje, titulo, lista_opciones)
El siguiente ejemplo muestra su funcionamiento
from easygui import *
mensaje ="Elija su opcion"
titulo = "Menu"
lista_opciones = ["Opcion 1", "Opcion 2", "Opcion 3"]
eleccion = choicebox(mensaje, titulo, lista_opciones)
14. if eleccion=="Opcion 1":
print("Eligio 1")
elif eleccion=="Opcion 2":
print("Eligio 2")
elif eleccion=="Opcion 3":
print("Eligio 3")
else:
print("El usuario elige cancelar")
Menú con ventanas para una aplicación
El siguiente código genera un menú de opciones con ventanas utilizando los elementos
anteriormente descritos que puede ser utilizado para sus proyectos y programas:
from easygui import *
while True:
mensaje ="Elija su opcion"
titulo = "Menu"
lista_opciones = ["Opcion 1", "Opcion 2", "Opcion 3"]
eleccion = choicebox(mensaje, titulo, lista_opciones)
if eleccion=="Opcion 1":
msgbox("Usted escogio: " + str(eleccion), "Eleccion")
elif eleccion=="Opcion 2":
msgbox("Usted escogio: " + str(eleccion), "Eleccion")
elif eleccion=="Opcion 3":
msgbox("Usted escogio: " + str(eleccion), "Eleccion")
else:
msgbox("Hasta pronto")
break
15. TALLER
1. VALOR (2.0) (Este programa debe ser creado con las funciones print e input, no debe
usar Easygui)
Defina una función Python con def que reciba como parámetro un número entero y que
devuelva verdadero si el número es primo y falso si el numero no es primo.
Cree un programa en python que defina una lista de números primos vacía [] y mediante un
ciclo llene la lista con los primeros 20 números primos.
Posteriormente debe imprimir la lista de los 20 números primos, la salida debe ser similar a
la siguiente:
1
3
5
7
etc.
Nota: Un valor booleano para una variable Python se define así
variable=True
o
variable=False
Existen los siguientes casos:
1. Si el número es igual a 1 es primo
2. Si el número es mayor que dos se evalúa para todos los números desde 2 hasta el número
si es divisible por dicho número.
2. VALOR (2.0) Modifique el programa creado en 1 para que solicite del usuario un número
entre 1 y 100 (utilizando ventanas Easygui), el programa debe evaluar si es primo o no
(mediante la función creada en 1), si es primo, lo agrega a la lista, de lo contrario muestra un
cuadro de dialogo que dice "No es primo".
El programa debe evaluar si el número ingresado se encuentra en la lista, si existe
previamente debe mostrar un mensaje que diga "El numero ya esta en la lista".
Si la lista no está vacía, debe mostrarla en una ventana y posteriormente mostrar una
ventana Si / No con el mensaje "Elija Si o No para Continuar".
Si el usuario selecciona Si, vuelve a solicitar un número entre 1 y 100 de lo contrario termina
el programa.
3. VALOR (1.0) Modifique el programa creado en 2 para que tenga un menú de opciones
(basado en ventanas de Easygui).
Sugerencia: puede basarse en el código (Menú con ventanas para una aplicación )
16. 1. Agregar un numero primo
2. Eliminar un numero primo
3. Ordenar el listado
4. Mostrar la lista de números primos
5. Salir