Canvas + Scrollbars + Skalieren

Fragen zu Tkinter.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Allmählich habe ich den Eindruck, du solltest dich einmal intensiver mit der Tkinter-Doku (speziell Canvas) beschäftigen. Meine Empfehlung dazu:

http://infohost.nmt.edu/tcc/help/pubs/t ... anvas.html

Ich weiß ja nicht genau, was du mit "Graph" meinst. Sollte es sich um einen Streckenzug handeln, dann brauchst du dafür nicht 1000 Elemente, sondern kannst es als EIN line-Objekt zeichnen. Dann ist das Neuzeichnen auch kein Akt. Das Neusetzen der Grenzen für die Scrollregion ist aber auch kein Ding.

Dass die Achsen den Graphen überlagern ist klar. Da sie immer wieder neu gezeichnet werden, haben sie eine höhere ID als der Graph und werden zu oberst gezeichnet. Mittels tag_raise() bzw. tag_lower() kannst du das wie gewünscht einstellen.

Und das mit rechts oben statt links oben bekommst du auch allein noch hin ... :wink:
Alberich
User
Beiträge: 1
Registriert: Donnerstag 16. Oktober 2008, 12:27
Kontaktdaten:

Danke für die Code-Snippets, das erleichtert die Sache ganz immens.
Früher hatten wir Handystrahlung, jetzt [url=http://www.moobiair.de/mobiles-internet/mobiles-internet/]UMTS Internet[/url], strahlt mehr, geht aber auch schneller.
Daniel_SGe
User
Beiträge: 28
Registriert: Montag 8. September 2008, 19:39

Sry, dass ich mich so lang nicht gemeldet hab, aber ich hatte nicht allzuviel Zeit und in dieser musste ich mich schließlich auch durch diverse Tkinter-Dokumentationen kämpfen;) .

Trotz allem sind noch ein paar Fragen offengeblieben:


Dass die Achsen den Graphen überlagern ist klar. Da sie immer wieder neu gezeichnet werden, haben sie eine höhere ID als der Graph und werden zu oberst gezeichnet. Mittels tag_raise() bzw. tag_lower() kannst du das wie gewünscht einstellen.
Der Graph (ja, ein Streckenzug ;) ) sollte ja nicht nur nicht die Achsen überlagern, sondern auch ab diesem Punkt abgeschnitten sein, sprich, nach dem Überschreiten nicht mehr sichtbar sein.
Ich hab mir jetzt damit beholfen, zusätzlich farbneutrale Rechtecke einzufügen, durch die dann der Graph nicht mehr durchgeht. Wäre solch eine Lösung "unschön", wenn Ja, wie würde man es "richtig" machen?

Und das mit rechts oben statt links oben bekommst du auch allein noch hin ...
Die einzige Möglichkeit, die mir eingefallen ist, ist die Y-Scrollbar nach ganz unten zu setzen.
Laut Dokumentation geschieht dies mit der Methode set(lo, hi).
Leider passiert überhaupt nichts wenn ich setze set(0.0, 1.0).
Lasse ich mir mittels "get" die Werte anzeigen, erscheint je nach Y-Länge "(0.x, 1.0)".
Setze ich ein solches Wertepaar mit set, funktioniert das ganze allerdings wieder ohne Probleme, jedenfalls so lang bis man die Y-Länge wieder ändert.
Ich versteh nicht, warum das ganze nicht mit (0.0, 1.0) funktioniert...

Weiteres Problem:

Da für kleine Y-Gesamtlängen des Graphen die Beschriftung beim Vergrößern des Fensters ins Negative geht, habe ich eine vom Graphen abhängige Maximalgröße des Root-Fensters festgelegt (geht dies eventuell auch über Framegröße? ). Wenn jedoch das Fenster schon größer als der Maximalbereich ist, wird es nicht automatisch verkleinert. Kann man dies irgendwie errreichen?


Zum Skalieren:

Ich hatte mir überlegt, dass man einfach nur den Graphen und die Beschriftung der Achsen mit angepassten Werten neuzeichnen müsste, wenn das Scrollrad bewegt wird. In der Dokumentation kann ich leider kein passendes Event finden. Gibt es wirklich keins?


Danke für die Code-Snippets, das erleichtert die Sache ganz immens.
Angemeldet dafür?!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Daniel_SGe hat geschrieben:Ich hab mir jetzt damit beholfen, zusätzlich farbneutrale Rechtecke einzufügen, durch die dann der Graph nicht mehr durchgeht. Wäre solch eine Lösung "unschön", wenn Ja, wie würde man es "richtig" machen?
Naja, eine "schöne" Lösung ist es in meinen Augen nicht. Halt so hingefrickelt, bis es passt. Andererseits halte ich das hier aber für legitim und ausreichend. Alternativen wären, die Zeichenintervalle für den Graphen entsprechend zu beschränken oder aber mit einer Extra-Canvas zu arbeiten: Die äußere Canvas nimmt das Koordinatensystem auf; in diese Canvas hinein wird dann eine zweite platziert, die den Graphen aufnimmt. Beides dürfte aber deutlich komplizierter werden als das Überdecken mit einem Rechteck und darum: Lass es so.

Was die anderen Punkte angeht, so wird es immer schwieriger, hier Lösungshilfen zu geben ohne konkreten Code zu sehen. Wenn du den aktuellen Code einmal posten könntest, mit entsprechenden Beispielgraphen, an denen du exemplarisch zeigen kannst, wie sich das Programm derzeit verhält und wie du es gerne anders hättest, dann wäre das hilfreich.
Daniel_SGe
User
Beiträge: 28
Registriert: Montag 8. September 2008, 19:39

Hier der gewünschte Beispielcode:


Ich hab als Beispiel 2 dreieckige Graphen benutzt. Einmal mit der Höhe 10 und einmal mit der Höhe 7.
Der 1. Graph wird am Anfang gezeichnet. Der zweite wird durch einen Druck auf Enter gezeichnet.

Gleich am Anfang wird so auch gleich das 1. Problem sichtbar. Die Y-Scrollbar befindet sich weder in der einen noch in der anderen Position. eigentlich sollte sie ganz unten liegen, damit man so auch den Koordinatenursprung sieht.

Klicke ich nun auf maximieren, passt der Graph wunderbar ins Bild (ausreichende Bildschirmauflösung sei vorausgesetzt ;) ). Lasse ich nun durch einen Druck auf Enter den 2. Graph zeichnen, tritt zuallererst wieder Problem Nummer 1 auf.
Weiterhin ist das Fenster nach wie vor maximiert, dabei hat sich die "maxsize" doch verschoben. Durch Aufheben und anschließendes Maximieren wird dieser Effekt zwar "behoben", schön ist das aber auch nicht. Problematisch ist außerdem, dass der maximal einsehbare Bereich plötzlich bei 11 liegt, dabei müsste er doch gerade bei der maximalen Höhe von 7 liegen.
Lasse ich die beiden Graphen andersherum zeichnen und gehe nach genau demselben Schema vor, habe ich letzeres Problem nicht, da der zuletztgezeichnete Graph "größer" ist.

Meine Frage ist daher: Kann ich einen solchen Resize erzwingen, damit maximal immer nur der Graph zu sehen ist?

Die Frage zum Skalieren bleibt die gleiche. Gibt es ein solches Event, Scrollrad-Hoch bzw. Scrollrad-Runter?
Zuletzt geändert von Daniel_SGe am Mittwoch 5. November 2008, 20:06, insgesamt 1-mal geändert.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Daniel_SGe

Kannst du das folgende einmal ausprobieren:

[Code ausgelagert]

Gruss wuf :wink:
Take it easy Mates!
Antworten