Неизвестный параметр для виджета масштаба tkinter

Я кодирую графический интерфейс, где вам нужно ввести число. Я хочу иметь весы, но они очень хорошо подходят для моей цели. Проблема в том, что шкала идет с точностью 1e-9. Это слишком точно для меня. Я использую расширение ttk для tkinter. Я попробовал пару вещей, но увидел, что для шкалы есть опция цифр, которая, когда есть StringVar(), оставляет количество цифр, но это не работает, она не может распознать опцию. Я пытался искать в библиотеке, но ничего не нашел, это было слишком сложно.

Вот как формируется мой код:

scaleValue = StringVar()
scale = ttk.Scale(content, orient=HORIZONTAL, from_=1, to=5, variable=scaleValue, length=150, digits=1)  # here digits ins't recongnised
scale.grid(column=x, row=y)

scaleValueLabel = ttk.Label(content, textvariable=scaleValue)
scaleValueLabel.grid(column=x', row=y')

Вот документация:

Целое число, указывающее, сколько значащих цифр следует сохранить при преобразовании значения шкалы в строку. http://www.tcl.tk/man/tcl8.6/TkCmd/scale.htm


person BrockenDuck    schedule 19.06.2019    source источник
comment
Параметр digits предназначен для tk.Scale, но не для ttk.Scale.   -  person Henry Yik    schedule 19.06.2019
comment
Могу ли я тогда чередовать виджеты tk и виджеты ttk? И есть ли еще разница?   -  person BrockenDuck    schedule 19.06.2019
comment
Между ними есть стилистические и косметические различия. Также некоторые параметры недоступны друг в друге, но все же можно использовать ttk.Scale, если вам нравится его внешний вид.   -  person Henry Yik    schedule 19.06.2019


Ответы (1)


digits — это параметр, доступный только для tk.Scale. Если вы переключитесь на его использование, то ваш код будет работать:

scale = tk.Scale(root, orient=tk.HORIZONTAL, from_=1, to=5, variable=scaleValue, length=150, digits=5)

Но если вы действительно хотите использовать ttk.Scale, вы можете использовать другой подход. Вместо того, чтобы использовать textvariable в Label, вы можете отслеживать изменения в своей переменной, сначала обрабатывать значение, а затем возвращать его обратно в Label.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

scaleValue = tk.DoubleVar()
scale = ttk.Scale(root, orient=tk.HORIZONTAL, from_=1, to=5, variable=scaleValue, length=150)  # here digits ins't recongnised
scale.grid(column=0, row=0)

scaleValueLabel = tk.Label(root, text="0")
scaleValueLabel.grid(column=0, row=1)

def set_digit(*args):
    scaleValueLabel.config(text="{0:.2f}".format(scaleValue.get()))

scaleValue.trace("w", set_digit)

root.mainloop()
person Henry Yik    schedule 19.06.2019