Graphische Animation von num. Integration: Punkte zeichnen!

Fragen zu Tkinter.
Antworten
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

Hallo!

Ich möchte die Ergebnisse eines Bewegungsgleichungs-Integrations-Algorithmus' für ein Teilchen grafisch veranschaulichen. Sprich: Die Trajektorie des Teilchens darstellen.

Vom Prinzip her ist da ja schonmal der/die/das Canvas von Tkinter nicht ganz falsch oder? Aber wie schaffe ich es dort einfache Punkte zu zeichnen? Was ich eigentlich möchte ist vom Prinzip her ein weißer Hintergrund und dann blaue/grüne/bunte(scheissegal!) Punkte irgendeiner Dicke/Größe, an beliebigen Stellen (Koordinaten) auf dem Canvas. Also natürlich eigentlich an den Koordinaten, die der Integrationsalgorithmus ausrechnet, wobei ich die dann ja vielleicht noch anders skalieren muss..

Habt ihr Alternativen für meine Anwendung? Das gesamte Skript muss auf den Maschinen der Uni lauffähig sein. Dort gibt es Python 2.5. Ich muss auf die Python Standardlib zurückgreifen, um die Lauffähigkeit zu garantieren oder?
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi,

Du könntes auch die PIL nehmen, aber für den Anfang ist Tkinter.Canvas wohl ausreichend.
Mit Canvas.create_oval(...) kannst du Punkte zeichen, als Koordinaten einfach die obere linke und untere rechte Ecke des Rechtecks (bzw. hier des Quadrats) angeben, in dem dein Punkt/Kreis liegen soll.
Mit der option "fill" kannst du das Innere des Kreises füllen, indem du eine beliebige Farbe angibst.
Damit müsstes du schon recht weit kommen, sonst guckste mal bei effbot.org oder in ner anderen Doku/Tutorial :wink:

Gruß
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

Okay, danke! Also gibt es wirklich keine konkrete Punktzeichnenmethode für Tkinter... ist ja lustig :)

Wegen der Standardbibliotheksache muss ich also auf Tkinter zurückgreifen, ja? PIL kann ich da also vergessen.

Wie schaut das mit der Geschwindigkeit aus? Ist es ein Problem ein Canvas mit meinetwegen zehntausenden Punkten (bzw kleinen gefüllten Kreisen) vollzumalen? Bleibt das Fenster fit wie ein Turnschuh?
BlackJack

`Tkinter.Canvas` bietet Vektorgrafik, da gibt es keine Punkte bzw. sind die "unendlich klein". Man muss also noch angeben welche Ausmasse ein Punkt hat. Und da währen wir dann bei Quadraten oder Kreisen.
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

akzeptiert. Dann ist das so blöd ja gar nicht.

Also, wie schauts aus mit der Geschwindigkeit? Kann da jemand was zu sagen oder erübrigt sich diese Frage mit einem "boah, was will der denn?" :)
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Also es kommt schon drauf an, was du willst.
Meisten ist Geschwindigkeit nicht so ein großes Problem, wenn du natürlich jede Sekunde 1.000.000 Punkte oder so erneuern willst, kanns schon etwas langsamer werden :wink:
Vor allem musst du das, was du nicht mehr brauchst, löschen und nicht übermalen!
BlackJack hat geschrieben:`Tkinter.Canvas` bietet Vektorgrafik, da gibt es keine Punkte bzw. sind die "unendlich klein". Man muss also noch angeben welche Ausmasse ein Punkt hat. Und da währen wir dann bei Quadraten oder Kreisen.
Es soll Leute geben, die machen das so:

Code: Alles auswählen

canvas.create_text(50,50, text = ".")
:lol:
BlackJack

Da kommt es dann aber sehr darauf an wo dieser Punkt *wirklich* gesetzt wird. Und wenn man mit Linien ein Raster und Achsenbeschriftung erstellt hat, möchte man normalerweise nicht, dass die Messpunkte alle etwas tiefer und einen Tick nach rechts verschoben sind. ;-)
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Darum ist das ja auch ein Level schwieriger :wink:
Wer nicht rechnen möchte, kann ja auch die Linien mit "_" und "|" darstellen. :D
Aber da brauch man dann eig. auch kein Tkinter mehr :D
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

Dass die pythonw.exe unter Windows nach ein bisschen (!) malen schon 45 MB Speicher für sich beansprucht ist normal? Also das ist sozusagen der Grundstock. Wenn ich dann viel viel mehr Punkte zeichne (sagen wir mal 200000), gehts hoch bis ~ 65 MB. Der Zuwachs geht ja dann in Ordnung vom Gefühl her. Aber dass das schon soviel ist, wenn ich fast noch nichts gemacht hab.. hm. Liegt hoffentlich einfach am Canvas und nicht an Tkinter ansich.

Ich habe im Moment so eine Methode drin zum Programm beenden per "X":

Code: Alles auswählen

    self.master.protocol('WM_DELETE_WINDOW', self.onQuit) 
  def onQuit(self):
    sys.exit()
Habe fürs rechnen und zeichnen nen eigenen Thread. Das ganze Programm dann mit sys.exit() zu beenden ist nicht wirklich sauber oder? Ich komme darauf, weil dann beim Beenden manchmal noch ne Fehlerausgabe eines Threads kommt.
BlackJack

Zu Canvas-Objekten muss man vielleicht noch sagen, dass es wirklich Objekte sind. Da wird nicht einfach ein Kreis oder ein Rechteck gezeichnet, also in Pixelgrafik umgewandelt und das war's, sondern jedes Element ist ein Objekt, das man noch nachträglich verändern kann (Farbe, Grösse, Position, etc.).
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi gurke111!
- Wie oben bereits gesagt, ist ab einer bestimmten Punktanzahl PIL besser geeignet, vor allem wenn du nicht jedes Zwischenbild zeigen möchtest, sondern mit einem Schlag 200000 Punkte malst.
-Tkinter +Thread = vermutlich Probleme. Versuche wenn möglich Threads durch die after-Methode zu ersetzen.
-Zum Beenden findest du hier ne Menge Beiträge, nur ein paar Tips:
Tkinter mainloop beenden mit quit
Tkinter Tk mit destroy zerstören
fertig (kein sys.exit)
Antworten