1

I am coding a GUI where you have to enter a number. I want to have a scale but it fits my purpose very well. The problem is a scale goes to 1e-9 precision. This is much to precise for me. I am using ttk extension for tkinter. I have tried a couple of things but I saw that there is a digits option for the scale which, when there is a StringVar(), leaves the number of digits but it doesn't work, it cannot recognise the option. I tried to look in the library but I couldn't find anything, it was too complicated.

Here is how my code is formed:

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')

Here is the documentation:

An integer specifying how many significant digits should be retained when converting the value of the scale to a string. Official Documentation : http://www.tcl.tk/man/tcl8.6/TkCmd/scale.htm

finefoot
  • 9,914
  • 7
  • 59
  • 102
BrockenDuck
  • 220
  • 2
  • 14
  • The `digits` parameter is for `tk.Scale` but not `ttk.Scale`. – Henry Yik Jun 19 '19 at 10:38
  • Could I then alternate between tk widgets and ttk widgets ? And is there another difference ? – BrockenDuck Jun 19 '19 at 10:49
  • There are styling and cosmetic differences between the two. Also some options are not available in one another - but it is still possible to use `ttk.Scale` if you like its look. – Henry Yik Jun 19 '19 at 10:52

1 Answers1

1

digits is a parameter only available to tk.Scale. If you switch to using it, then your code will work:

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

But if you really want to use ttk.Scale, you can use a different approach. Instead of using a textvariable in your Label, you can trace the changes on your variable, process the value first, and then pass back to your 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()
Henry Yik
  • 22,275
  • 4
  • 18
  • 40