71 - ttk : control Spinbox

Este control visual es muy utilizado para seleccionar un valor de una lista. Se dispone de dos botones para subir o bajar en la lista de valores posibles:

Spinbox

Se pueden mostrar listas de valores de tipo string.

Problema:

En una aduana hay una máquina que sortea las personas cuyo equipaje serán revisados.
La persona selecciona la cantidad de bultos (hacer dicha selección mediante un Spinbox)

Luego se presiona el botón sortear y aparece al lado de este botón una Label de color rojo o verde (En caso de ser rojo se revisa su equipaje, en caso de ser verde, no se revisa)
Para el sorteo generar un valor aleatorio entre 1 y 3. Si se genera un 1 se revisa, si se genera un 2 o 3 no se revisa, mostrar un mensaje de error si el Spinbox tiene un cero.

La interfaz visual debe ser similar a esta:

Spinbox

Programa: ejercicio252.py

Ver video

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox as mb
import random

class Aplicacion:
    def __init__(self):
        self.ventana1=tk.Tk()
        self.label1=ttk.Label(self.ventana1, text="Seleccione la cantidad de bultos:")
        self.label1.grid(column=0, row=0, padx=10, pady=10)
        self.spinbox1=ttk.Spinbox(self.ventana1, from_=0, to=100, width=10, state='readonly')        
        self.spinbox1.set(0)        
        self.spinbox1.grid(column=1, row=0, padx=10, pady=10)
        self.boton1=ttk.Button(self.ventana1, text="Sortear", command=self.sortear)
        self.boton1.grid(column=0, row=1, padx=10, pady=10)
        self.label2=ttk.Label(self.ventana1, text="", width=20)
        self.label2.grid(column=1, row=1, padx=10, pady=10)
        self.ventana1.mainloop()

    def sortear(self):
        if int(self.spinbox1.get())==0:
            mb.showerror("Cuidado","Debe seleccionar un valor distinto a cero en bultos")
        else:
            valor=random.randint(1,3)
            if valor==1:
                self.label2.configure(text="Se deben revisar")
                self.label2.configure(background="red")
            else:
                self.label2.configure(text="No se revisan")
                self.label2.configure(background="green")

aplicacion1=Aplicacion() 

Cuando creamos el Spinbox pasamos el parámetro 'from_' con el valor inicial y el parámetro 'to' con el valor final (el nombre tan extraño de 'from_' se debe a que Python tiene una palabra reservada con dicho nombre):

        self.spinbox1=ttk.Spinbox(self.ventana1, from_=0, to=100, width=10, state='readonly')        

Mediante el método set indicamos el valor inicial que muestra el Spinbox:

        self.spinbox1.set(0)        

Cuando se presiona el botón "sortear" se ejecuta el método 'sortear' donde primero verificamos si el Spinbox tiene el valor cero seleccionado, en caso afirmativo mostramos un mensaje de error:

    def sortear(self):
        if int(self.spinbox1.get())==0:
            mb.showerror("Cuidado","Debe seleccionar un valor distinto a cero en bultos")

En el caso que el operador eligió un valor distinto a cero procedemos a generar un valor aleatorio entre 1 y 3. Según el valor aleatorio generado procedemos a modificar el color de fondo de la label:

            valor=random.randint(1,3)
            if valor==1:
                self.label2.configure(text="Se deben revisar")
                self.label2.configure(background="red")
            else:
                self.label2.configure(text="No se revisan")
                self.label2.configure(background="green")

Acotaciones

  • Si queremos llenar el Spinbox con valores no consecutivos, sino de 3 en 3 podemos utilizar la siguiente sintaxis:

    self.spinbox1=ttk.Spinbox(self.ventana1, increment=3, from_=1, to=10, state='readonly')        
    
  • Podemos definir una tupla y luego inicializar el parámetro values:

    dias=("lunes", "martes", "miércoles","jueves","viernes","sábado","domingo")
    self.spinbox1=ttk.Spinbox(self.ventana1, values=dias,  state='readonly')        
    self.spinbox1.set(dias[0])