Aquí tienes las soluciones de los ejercicios de Python y Tkinter del día 18 que encontrarás en esta página.
- Solo tenías que utilizar el método randint() del módulo random, para recibir un número entro aleatorio.
import random aleatorio = random.randint(0, 1000)
#Importaciones import random #Generar número aleatorio aleatorio = random.randint(0, 1000) #Solicitar número al usuario numero = int(input("¿Podrás adivinar el número secreto?\nPuede ser un número del 0 al 1000.\n")) #Bucle indeterminado para ir dando pistas al usuario. while True: if numero < aleatorio: print("El número es más alto.") numero = int(input(f"Introduce un numero mayor que {numero}: ")) elif numero > aleatorio: print("El número es más bajo") numero = int(input(f"Introduce un numero menor que {numero}: ")) else: print(f"Lo has adivinado. Necesitaste {intentos} intentos.") break
#Importaciones import random #Generar número aleatorio aleatorio = random.randint(0, 1000) #Se cuentan los intentos intentos = 0 #Se solicita el número al usuario, la primera vez numero = int(input("¿Podrás adivinar el número secreto?\nPuede ser un número del 0 al 1000.\n")) #Bucle indeterminado para ir dando pistas al usuario. while True: if numero < aleatorio: print("El número es más alto.") numero = int(input(f"Introduce un numero mayor que {numero}: ")) elif numero > aleatorio: print("El número es más bajo") numero = int(input(f"Introduce un numero menor que {numero}: ")) else: print(f"Lo has adivinado. Necesitaste {intentos} intentos.") break
- Se crea una simple ventanita de Tkinter con un botón y una entrada.
#Importaciones from tkinter import * #Ventana root = Tk() root.title("www.programacionfacil.org") #Entrada de datos entrada = Entry(root) entrada.pack() #Botón Button(root, text="Enviar").pack() #Bucle de ejecución root.mainloop()
- Le he añadido cosas a la ventana que no voy a explicar de nuevo. Lo que interesa, es la línea 7. Esta lleva un showinfo para indicar el comienzo del juego y las instrucciones.
En la línea 12, he añadido el método attributes() para que la ventana principal se muestre siempre al frente, ya que al salir antes que nada el showinfo(), en muchas ocasiones, queda la ventana por detrás.
Lo último que te interesa aquí, son las líneas de la 26 a la 53, que lleva el mismo juego de los ejercicios anteriores, solo que llevado a Tkinter con messagebox.
Por lo del uso de «global» en la variable «intentos», esto también lo explico en el vídeo.
#Importaciones from tkinter import * import tkinter.messagebox as msb import random #Mensaje de inicio del juego msb.showinfo("Adivina el número.", "Introduzca un número del 0 al 1000. ¿Cuántos intentos necesitará para conseguir acertar el número secreto?") root = Tk() root.title("www.programacionfacil.org") root.resizable(False, False) root.attributes("-topmost", True) ancho_ventana = 400 alto_ventana = 100 #Pantalla ancho_pantalla = root.winfo_screenwidth() alto_pantalla = root.winfo_screenheight() coordenadas_x = int((ancho_pantalla/2) - (ancho_ventana/2)) coordenadas_y = int((alto_pantalla/2) - (alto_ventana/2))- 37 root.geometry("{}x{}+{}+{}".format(ancho_ventana, alto_ventana, coordenadas_x, coordenadas_y)) #Entrada de datos entrada = Entry(root) entrada.insert(0,"Escriba un número...") entrada.bind("<Button-1>", lambda d : entrada.delete(0, END)) entrada.pack() aleatorio = random.randint(0, 1000) intentos = 1 print(aleatorio) #Evento para el botón def pulsar_boton(): global intentos #Se obtiene el valor del Entry try: numero = int(entrada.get()) if numero < aleatorio: msb.showinfo("¡Fallaste!", f"El número es mayor. Introduce un número mayor que {numero}.") intentos += 1 elif numero > aleatorio: msb.showinfo("¡Fallaste!", f"El número es menor. Introduce un número menor que {numero}.") intentos += 1 else: msb.showinfo("¡Excelente!", f"Lo has adivinado. Necesitaste {intentos} intento/s.") except: msb.showerror("¡Error!", "Valor no válido.") intentos += 1 #Botón Button(root, text="Enviar", command=pulsar_boton).pack() #Bucle de ejecución root.mainloop()
- Cada uno devuelve una cosa diferente. Te pongo un ejemplo de como puedes comprobarlo por tu cuenta:
#Importaciones import tkinter.messagebox as msb #Capturamos en una variable el valor devuelto por el messagebox valor = msb.showinfo("www.programacionfacil.org","Probando los messagebox") #Se imprime el valor print(valor)
- showinfo: ok. Cruz de cierre – ok.
- showwarning: ok. Cruz de cierre – ok.
- showerror: ok. Cruz de cierre – ok.
- askquestion: yes (botón sí), no (botón no). Cruz de cierre deshabilitada.
- askyesno: True (botón sí), False (botón no). Cruz de cierre deshabilitada.
- askokcancel: True (botón aceptar), False (botón cancelar y cruz de cierre).
- askyesnocancel: True (botón sí), False (botón no), None (botón cancelar y cruz de cierre).
- askretrycancel: True (botón reintentar), False (botón cancelar y cruz de cierre).
Por cierto, en la teórica, te he comentado que askquestion y askyesno son iguales. Para el usuario sí, pero como puedes ver, internamente, se tratan de forma distinta, al devolver dos valores diferentes.
- Hay varias formas de hacer esto. A mi me gusta hacerlo así:
#Importaciones import tkinter.messagebox as msb #Capturamos en una variable el valor devuelto por el messagebox valor = msb.askyesnocancel("www.programacionfacil.org","Probando los messagebox") if valor: print('El usuario ha pulsado el botón "Sí".') elif valor is False: print('El usuario ha pulsado el botón "No".') else: print('El usuario ha cancelado.')
Por cierto, creo que lo he explicado ya en el curso, pero por si acaso, lo explico de nuevo.
Lo del if es una abreviación de «if valor == True». Lo del elif es una forma diferente de poner «elif valor == False». El else, contempla cualquier otro valor, por lo tanto, si es «None» lo que devuelve la cruz de cierre o el botón de cancelar, se ejecuta su código.
Muy buen curso, no deja de sorprender, abrazo!!!!
¡Muchas gracias! Un abrazo.