¿Cómo obtengo el valor de un slider (Scale) en tkinter?
Llama a .get() sobre el deslizador para el valor actual, o dale un command para que te avise en cada movimiento. Esos dos caminos no te entregan el mismo tipo, y ahí empieza la confusión.
import tkinter as tk
root = tk.Tk()
volume = tk.Scale(root, from_=0, to=100, orient="horizontal")
volume.pack()
def apply_it():
print("volumen", volume.get()) # un número
tk.Button(root, text="Aplicar", command=apply_it).pack()
root.mainloop() La función del command recibe texto
El command de un Scale se llama con la posición nueva como único argumento, y Tk la pasa como texto: "42" en el Scale clásico y "42.0" en el de ttk. Usarlo directamente en una operación aritmética lanza TypeError, lo cual desconcierta porque .get() sobre ese mismo widget devuelve un número.
Convierte el argumento, o ignóralo y llama a .get() dentro del manejador. Cualquiera de las dos está bien; confundirlas es lo que cuesta la tarde.
def on_move(value):
print(float(value) + 1) # convierte lo que te entregan
print(volume.get() + 1) # o pregúntale al widgetEnteros o decimales
En el tk.Scale clásico, resolution decide el paso y el tipo que recibes: el valor por defecto de 1 da enteros y resolution=0.1 da decimales. También controla dónde puede quedarse el deslizador, así que es la opción indicada cuando el valor tiene que caer en una cuadrícula.
tk.Scale(root, from_=0, to=1, resolution=0.1) # 0.0, 0.1, 0.2 …tk.Scale y ttk.Scale no son el mismo widget
El ttk.Scale con tema se ve nativo y es el que ttkbootstrap estiliza, pero pierde varias opciones del clásico. No tiene resolution ni showvalue, y .get() siempre devuelve un decimal, así que un deslizador con tema que deba informar enteros necesita que los redondees tú.
El tk.Scale clásico muestra su número encima de la barra por defecto y se le puede pedir que no lo haga con showvalue=False. Si quieres ese número en un deslizador con tema, pon una Label al lado y actualízala desde la función del command.
import tkinter.ttk as ttk
s = ttk.Scale(root, from_=0, to=100)
round(s.get()) # los deslizadores con tema devuelven decimales Hacerlo sin buscarlo
Arrastra un Scale, pon el rango en el inspector y elige el toolkit después: la exportación escribe el widget clásico o el que tiene tema según corresponda, así que la diferencia de arriba queda resuelta. Los stubs de los manejadores ya vienen con el argumento en la firma, que es la mitad que se olvida.
Diseña la ventana visualmente y ve el código Python generado sobre la marcha.
Abrir el diseñador de tkinter →