Seite 1 von 1

Wertübergabe vom tk.Scale

Verfasst: Samstag 17. Februar 2024, 19:54
von hubgra

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?

Re: Wertübergabe vom tk.Scale

Verfasst: Samstag 17. Februar 2024, 20:11
von __blackjack__
Die `mainloop()` ist in der letzten Zeile. Warum sollte die irgendwas ausgeben? Die Ausgabe kommt in der Zeile bevor die Hauptschleife aufgerufen wird.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 08:46
von hubgra
Ich dachte, die Hauptschleife wird ständig wiederholt und bei Veränberung des Werts kann dieser mit print(x.get()) ausgegeben werden.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 09:00
von sparrow
@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.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 10:01
von __deets__
Die Hauptschleife schleift nicht. Die wartet auf EREIGNISSE. Eingaben des Users oder Systemereignisse.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 13:25
von hubgra
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.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 13:30
von __blackjack__
@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.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 13:52
von hubgra
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

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 15:51
von __blackjack__
@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`.

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 17:16
von hubgra
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()?

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 17:21
von Sirius3
So lange es nur einfache Polygone sind, bleibt es dabei, warum nutzt Du nicht einfach tk.Canvas?

Re: Wertübergabe vom tk.Scale

Verfasst: Sonntag 18. Februar 2024, 18:06
von hubgra
Der Geometrie-Modul ist ziemlich fortgeschritten, es gibt ja verschiedene Konstruktionen; ich wollte einfach tk.Scale() nutzen!