Jun-28-2024, 01:35 AM
(This post was last modified: Jun-28-2024, 01:35 AM by deanhystad.)
I would make a new widget that combines the scale widget with the label. Something like this:
import tkinter as tk class Slider(tk.Frame): """A Scale widget with a label that displays the power range of the slider. Also converts slider to PWM.""" default_table = ((1, "Off"), (51, "Low Speed"), (76, "High Speed"), (0, "Maximum Speed")) def __init__(self, parent, title, width=200, command=None, table=None, rmin=1100, rmax=1900): super().__init__(parent, width=width) self.command = command self.table = table or default_table self._rmin = rmin self._rmax = rmax self._title = tk.Label(self, text=title) self._label = tk.Label(self, text=self.table[0][1]) self._thrust = tk.DoubleVar(self, 0) self._slider = tk.Scale( self, variable=self._thrust, orient=tk.HORIZONTAL, from_=0, to=100, command=self._slider_changed, length=width, ) self._title.grid(row=0, column=0, sticky="W") self._label.grid(row=0, column=1, sticky="E") self._slider.grid(row=1, column=0, columnspan=2, sticky="EW") def title(self): """Return title str.""" return self._title["text"] def label(self): """Return label str.""" return self._label["text"] @property def thrust(self): """Return thrust value for label.""" return self._thrust.get() @thrust.setter def thrust(self, new_value): """Set thrust value.""" self._thrust.set(new_value) def pwm(self): """Return thrust setting as PWM""" return int(self._rmin + self._rmax - self._rmin * self.thrust / 100) def _slider_changed(self, _): """Slider moved. Update label and call callback.""" thrust = self._thrust.get() for level, new_text in self.table: if thrust < level: break self._label["text"] = new_text if self.command is not None: self.command(self.pwm()) def __str__(self): return f"<Slider {self.title()}, slider = {self.thrust}, power = {self.label()}, pwm = {self.pwm()}" class MainWindow(tk.Tk): """Demonstrate making sliders.""" def __init__(self): super().__init__() for name in ("light", "forward", "reverse", "ascend", "descend"): slider = Slider(self, name) slider.command = lambda x, y=slider: print(y) slider.pack(side=tk.TOP, padx=10, pady=10) MainWindow().mainloop()