Problem mit ttk.Scale set()

Fragen zu Tkinter.
Antworten
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Hi,
Auch wenn ich mittlerweile einigen auf den Geist gehe,
ich habe schon wieder ein kleines Problem, das sicher ganz einfach zu lösen ist.

Ich habe ein ttk.Scale mit einem command, welches aber den Value der Scale
ändern soll. Grund ist das es keine resolution in ttk für die Scale gibt, und ich den wert immer
Runden möchte.

Denau genommen funktioniert das auch ganz gut Problem ist nur das die .set() - Methode
immer wieder das command aufruft und somit einen rekursiven aufruf erzeugt.
Also wie kann ich die Rekursion verhindern bzw. den Value anders setzen oder
gibt es schon eine amdere möglichkeit eine resolution in ttk.Scale zusetzen ?

Wie immer danke schon mal im vorraus
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@Xynon1: Vielleicht gibt's einen besseren Weg, aber kannst Du in Deiner `set()`-Methode nicht Testen ob der Wert schon gerundet ist, und ihn nur dann ändern, wenn das nicht der Fall ist? Das sollte die Endlosrekursion doch eigentlich verhindern.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

ja, geht nur das ist eigentlich nicht der Sinn des ganzen,
aber so würde die Funktion nur zweimal auf gerufen
Zuletzt geändert von Xynon1 am Freitag 17. September 2010, 19:28, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Nimm doch das "Scale" von tk und nicht von ttk (Python 3.1).
Da funktioniert das:

Code: Alles auswählen

import tkinter as tk

def show(slider):
  print(slider.get())

  
root = tk.Tk()
slider = tk.Scale(root, from_=-5, to=13, length=200, orient='horizontal', resolution=0.4)
slider.config(command=lambda ev: show(slider))
slider.pack()

root.mainloop()
Weshalb "ttk.Scale" keine 'resolution' kennt, weiss ich allerdings auch nicht.
:wink:
yipyip
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

ist klar aber ich hasse so eine Mischmasch der Oberflächen
entweder nimmt man ttk oder tkinter für das menü ansonsten sieht die Anwendung scheußlich aus.

Ich habe es im übrigen über eine private Variable in der Klasse gelöst frei nach folgendem Motto:

Code: Alles auswählen

if self.__rounded:
    self.__rounded = False
    return

runde(value)

self.__rounded = True

scale.set(value)
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten