import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
class SpinboxDemo(tk.Tk):
def __init__(self):
super().__init__()
# Configurar a janela principal
self.title("Exemplos de Widget Spinbox")
self.geometry("400x500")
self.configure(bg='#f0f0f0')
# Criar e empacotar o rótulo do título
title = ttk.Label(
self,
text="Exemplos de Spinbox",
font=('Helvetica', 16, 'bold')
)
title.pack(pady=20)
# Criar frame para o spinbox básico
self.create_numeric_spinbox()
# Criar frame para o spinbox de texto
self.create_text_spinbox()
# Criar frame para o spinbox personalizado
self.create_custom_spinbox()
# Criar frame para o spinbox de validação
self.create_validated_spinbox()
def create_numeric_spinbox(self):
"""Cria um frame com um spinbox numérico básico"""
frame = ttk.LabelFrame(self, text="Spinbox Numérico Básico")
frame.pack(padx=10, pady=10, fill="x")
# Spinbox numérico básico
self.num_spinbox = ttk.Spinbox(
frame,
from_=0,
to=100,
increment=5,
command=self.on_numeric_change
)
self.num_spinbox.pack(padx=10, pady=10)
# Rótulo para mostrar o valor selecionado
self.num_value_label = ttk.Label(frame, text="Selecionado: 0")
self.num_value_label.pack(pady=5)
def create_text_spinbox(self):
"""Cria um frame com um spinbox baseado em texto"""
frame = ttk.LabelFrame(self, text="Spinbox de Texto")
frame.pack(padx=10, pady=10, fill="x")
# Spinbox baseado em texto
days = ('Segunda', 'Terça', 'Quarta', 'Quinta',
'Sexta', 'Sábado', 'Domingo')
self.text_spinbox = ttk.Spinbox(
frame,
values=days,
wrap=True,
command=self.on_day_change
)
self.text_spinbox.pack(padx=10, pady=10)
# Rótulo para mostrar o dia selecionado
self.day_label = ttk.Label(frame, text="Selecionado: Segunda")
self.day_label.pack(pady=5)
def create_custom_spinbox(self):
"""Cria um frame com um spinbox personalizado"""
frame = ttk.LabelFrame(self, text="Spinbox Personalizado")
frame.pack(padx=10, pady=10, fill="x")
# Spinbox personalizado com geração de cor aleatória
self.color_spinbox = ttk.Spinbox(
frame,
from_=0,
to=255,
increment=5,
command=self.update_color
)
self.color_spinbox.pack(padx=10, pady=10)
# Rótulo de visualização de cor
self.color_label = tk.Label(
frame,
text="Pré-visualização de Cor",
width=20,
height=2
)
self.color_label.pack(pady=5)
def create_validated_spinbox(self):
"""Cria um frame com um spinbox validado"""
frame = ttk.LabelFrame(self, text="Spinbox Validado (Apenas Números Pares)")
frame.pack(padx=10, pady=10, fill="x")
# Função de validação
vcmd = (self.register(self.validate_even), '%P')
# Spinbox validado
self.valid_spinbox = ttk.Spinbox(
frame,
from_=0,
to=100,
increment=2,
validate='key',
validatecommand=vcmd
)
self.valid_spinbox.pack(padx=10, pady=10)
def on_numeric_change(self):
"""Manipulador para alterações do spinbox numérico"""
value = self.num_spinbox.get()
self.num_value_label.config(text=f"Selecionado: {value}")
def on_day_change(self):
"""Manipulador para alterações do spinbox de dia"""
day = self.text_spinbox.get()
self.day_label.config(text=f"Selecionado: {day}")
def update_color(self):
"""Manipulador para alterações do spinbox de cor"""
try:
value = int(self.color_spinbox.get())
# Cria um gradiente de cor de vermelho para azul
color = f'#{value:02x}00{255-value:02x}'
self.color_label.config(bg=color)
except ValueError:
pass
def validate_even(self, value):
"""Função de validação para apenas números pares"""
if value == "":
return True
try:
num = int(value)
return num % 2 == 0
except ValueError:
return False
if __name__ == "__main__":
app = SpinboxDemo()
app.mainloop()