¿Cómo recuperar el valor entero del widget tkinter ttk Scale en Python?

¿Alguien podría recomendar cómo recuperar y actualizar un widget de Label con el valor de un widget de Scale en Python? Actualmente muestra un número real muy grande. He intentado escribir el valor de conversión, pero esto solo funciona cuando imprimo en inactivo. Intenté slider.get() pero la etiqueta está en blanco. También probé int(slider.get()) que funciona cuando int(slider.get()) en modo inactivo.

 from tkinter import * from tkinter import ttk root = Tk() root.title("Playing with Scales") mainframe = ttk.Frame(root, padding="24 24 24 24") mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) slider = IntVar() ttk.Scale(mainframe, from_=0, to_=100, length=300, variable=slider).grid(column=1, row=4, columnspan=5) ttk.Label(mainframe, textvariable=slider).grid(column=1, row=0, columnspan=5) for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) root.mainloop() 

Aquí puedes ver el gran valor real:

captura de pantalla

No veo una forma de controlar la resolución del widget de Escala, pero es bastante fácil modificar la cadena que produce. De acuerdo con estos documentos ttk, el widget de Escala devuelve un flotante, pero en mis experimentos devuelve una cadena, que es un poco molesta.

En lugar de configurar el texto de la etiqueta directamente desde la variable del slider adjunta al widget de Escala, podemos vincular un comando al widget de Escala que convierte la cadena que mantiene el valor actual de la Escala en un valor flotante, y luego formateamos esa flotación con el número de dígitos deseado ; el siguiente código muestra 2 dígitos después del punto decimal.

 import tkinter as tk from tkinter import ttk root = tk.Tk() root.title("Playing with Scales") mainframe = ttk.Frame(root, padding="24 24 24 24") mainframe.grid(column=0, row=0, sticky=('N', 'W', 'E', 'S')) slider = tk.StringVar() slider.set('0.00') ttk.Scale(mainframe, from_=0, to_=100, length=300, command=lambda s:slider.set('%0.2f' % float(s))).grid(column=1, row=4, columnspan=5) ttk.Label(mainframe, textvariable=slider).grid(column=1, row=0, columnspan=5) for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5) root.mainloop() 

Si solo desea que la etiqueta muestre el valor entero, cambie la inicialización del slider a

 slider.set('0') 

y cambiar la función de callback a

 lambda s:slider.set('%d' % float(s)) 

He hecho algunos otros cambios menores a su código. Principalmente, reemplacé la importación “estrella” con import tkinter as tk ; La importación de estrellas trae más de 130 nombres a tu espacio de nombres, lo que crea una gran cantidad de desorden innecesario, como mencioné en esta respuesta reciente .

Otra opción menos complicada y fácil de usar es utilizar una instancia de la clase tkinter.Scale() con la que puede inyectar la opción de resolution al valor que desee. El valor predeterminado es el que está buscando porque su valor es 1