Wertübergabe vom tk.Scale

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Code: Alles auswählen

[code]import tkinter as tk

root = tk.Tk()
x = tk.DoubleVar()
    
w1 = tk.Scale(root, from_=-10, to=10, orient=tk.HORIZONTAL, variable = x)
w1.pack()

print(x.get())

root.mainloop()
[/code]

Es erfolgt nur die Ausgabe 0.0, wo ist der mainloop?
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die `mainloop()` ist in der letzten Zeile. Warum sollte die irgendwas ausgeben? Die Ausgabe kommt in der Zeile bevor die Hauptschleife aufgerufen wird.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ich dachte, die Hauptschleife wird ständig wiederholt und bei Veränberung des Werts kann dieser mit print(x.get()) ausgegeben werden.
Benutzeravatar
sparrow
User
Beiträge: 4201
Registriert: Freitag 17. April 2009, 10:28

@hugbra: Wie soll das funktionieren, wenn die Ausgabe passiert, bevor die Schleife gestartet ist? Oder anders: Die Ausgabe ist doch gar nicht in der Schleife?

Du schreibst gerade einen Wert auf einen Zettel, hängst den an einen Baum und fährst anschließend mit deinem Auto immer im Kreis. Aber an den einmal aufgehängten Zettel ändert das nichts.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Hauptschleife schleift nicht. Die wartet auf EREIGNISSE. Eingaben des Users oder Systemereignisse.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ja, das meine ich: auf ein Ereignis soll reagiert werden. Das Verschieben den Reglers durch den User ist doch ein Ereignis. Aber wie kann das dem System mitgeteilt werden?
Ich möchte Koordinaten (x,y) einstellen und dann soll ein plt.plot(x,y) gemacht werden; dazu brauche ich aber das x.
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubgra: Dann musst Du eine Rückruffunktion dafür registieren. Entweder beim `Scale` oder beim `DoubleVar`, das dann jedes mal bei Veränderung aufgerufen wird und dort dann das gewünschte macht.

Edit: Ein `plt.plot()` will man dann auch eher nicht mehr machen, sondern die OOP-Schnittstelle von Matplotlib verwenden. Sonst operiert man auf globalem Zustand und handelt sich in der Regel auch ein Speicherleck ein, weil `plot()` neue `Figure`-Objekte erzeugt, sich das Modul die dann intern aber alle in einer Datenstruktur merkt.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ja, danke. Aber wie kann so eine Rückruffunktion aussehen?
Ich mache ja nicht einfach plt.plot(), Ich lege bisher Punkte A,B,C fest und lasse tkinter eine Funktion aufrufen, die ein Dreieck zeichntet. Ich möchte die Koordinaten der Punkte mit tk.Scale() einstellen.

'Eine Horde bedrohe nie.' -- Palindrom von chat GPT
Benutzeravatar
__blackjack__
User
Beiträge: 13131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hubgra: Das wird letztlich auf eine Rückrufmethode hinauslaufen, denn die muss ja Zugriff auf die nötigen Objekte haben. Also eine Klasse mit einer Methode (eventuell auch einfach in der `__init__()`) wo das Dreieck erstellt wird, und eine Methode für den Rückruf wo das Dreieck mit den Werten von den Slidern aktualisiert wird. Und wie gesagt, da dann nicht `plt.plot()`, sondern was auch immer die Tk-Integration von Matplotlib zum neuzeichnen mit geänderten Werten da vorgesehen hat.

Muss es zum Zeichnen von einem Dreieck denn unbedingt Matplotlib sein? Das ginge ja eigentlich auch mit `tkinter.Canvas`.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ich zeine ja nicht nur Dreiecke, ich habe einen Modulfür geometrische Konstruktionen verfasst und da netze ich matplotlib.
Ich möchte einfach nur über einen mit tk.Scale() einstellten Wert verfügen. Wie nutzt man den sonst tk.Scale()?
Sirius3
User
Beiträge: 17766
Registriert: Sonntag 21. Oktober 2012, 17:20

So lange es nur einfache Polygone sind, bleibt es dabei, warum nutzt Du nicht einfach tk.Canvas?
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Der Geometrie-Modul ist ziemlich fortgeschritten, es gibt ja verschiedene Konstruktionen; ich wollte einfach tk.Scale() nutzen!
Antworten