Punkte außerhalb des sichtbaren Bereichs eines Canvas

Fragen zu Tkinter.
Antworten
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Ich arbeite an einem Programm, das Funktionsgraphen in einem Canvas anzeigt.
Mein Problem ist jetzt folgendes: wenn ein Punkt (der Teil einer Linie ist) weit über oder unter dem anzeigbaren Bereich liegt, wird dieser Teil des Graphen in den sichtbaren bereich "verschoben"
Wenn ich also zum Beispiel eine steile Gerade habe, sehe ich nicht nur den Ausschnitt, der eigentlich sichtbar ist, sondern in regelmäßigen Abständen parallele Linien.

Woran liegt das und kann ich das abschalten?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!

Wenn Du z.B. mit create_line() oder create_oval() etwas ins "Off" malst, dürfte es auch nicht sichbar sein. Da muss also ein Fehler in Deinem Algorithmus sein. Zeig mal ein wenig Quellcode.

Jan
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Also, ich habe die Lösungsmenge einer Instanz f: f.L
Die ist eine Liste, die Tupel der Originalkoordinaten enthält.
Mit

Code: Alles auswählen

	
	def xumr(self, original):
		"""Rechnet Originalkoordinate (X) in Massstab um."""
		return  int(round( ( (original - self.D_min) * self.canvres_x ) / ( self.D_max - self.D_min) ))

	def yumr(self, original):
		"""Rechnet Originalkoordinate (Y) in Massstab um."""
		return  int(round( -( (original - self.W_max) * self.canvres_y) / ( self.W_max - self.W_min) ))
wird das Ganze umgerechnet und dann als Argument von
canv.create_line weitergeleitet.

wobei D_min und D_max die größte und kleinste angezeigte x-Koordinate ist und W_min, W_max entsprechend für y
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

An den Formeln kanns auch nicht liegen. Die sind ok. Also, yumr() gibt einen Wert z.B. größer self.canvres_y oder kleiner 0 zurück, liegt somit außerhalb des Canvas und wird trotzdem irgendwie gezeichnet (parallel zu was)? Seltsam. Hast Du die Werte mal ausgegeben, z.B. die Liste, die Du an create_line() übergibst? Gibt es da wirklich Wertepaare außerhalb des Canvas?
Wenn ja, musst Du wohl oder übel mal einen, aufs wesentliche reduzierten, lauffähigen Code posten, bei dem der Fehler auftritt.

from Tkinter import *
root=Tk()
canvas = Canvas(root,width = 200, height = 200)
canvas.pack()
canvas.create_line(100,-20,220,100,100,220,-20,100,100,-20)
root.mainloop()

Das ergibt ein um 45 Grad gedrehtes Quadrat, dessen Ecken außerhalb des Canvas liegen, d.h. man sieht nur 4 nichtverbundene Linien. Wenn das nicht bei Dir funktioniert, würd ich vielleicht Python neu installieren ;-)
Jan
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Ich hab gestern Abend noch mal versucht das Problem zu reproduzieren aber es hat auf Anhieb so funktioniert wie es soll.
Liegt vieleicht daran, dass ich meinen Code inzwischen ziemlich stark umgeschrieben habe oder daran, dass ich inzwischen Python 2.3 installiert habe, keine Ahnung...

Naja, wenns so bleibt, ist mein Problem damit wohl erledigt.
Trotzdem Danke für die Hilfe!
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Argh, jetzt ist es wieder da.
Auf meinem Notebook sieht alles so aus, wie es soll, aber auf meinem PC so wie auf dem Bild:
Bild
Die Funktionen die da angezeigt werden sind übrigens x^3 und x^5.
Im positiven Bereich wird es nicht mehr wiederholt, wie man sieht nur im negativen.
Pyton neu installieren wirds wohl auch nict unbedingt besser machen, da ich den Fehler ja schon mit 2.22 hatte, dann 2.3 neu installiert hab und es immer noch falsch ist.

Ansonsten wäre ich für Hilfe dankbar.
Hier liegt die Datei: http://web703.athen023.server4free.de/fuplo/fuplo.py
Wäre auch nett, wenn ein paar Leute sich die mal anschauen und mir sagen, obs bei ihnen funktioniert.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Geht bei mir ohne Probleme, hab Python 2.3 unter Win 2000. ich teste nachher nochmal unter Linux (Suse 8.2, Python 2.2). Keine Ahnung warum er das vermurkst.

Edit: geht auch da.
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Danke!
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Sieht so aus, als wenn du auf RedHat9 umstellen solltest. Bei mir ist das alles OK.

Code: Alles auswählen

[hans@rosi hans]$ rpm -q python tk
python-2.2.2-26
tk-8.3.5-88
[hans@rosi hans]$


/* habe mal die TK - Version noch dazugepackt */

Bild
Zuletzt geändert von hans am Freitag 22. August 2003, 19:56, insgesamt 1-mal geändert.
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Erstmal: Klasse Programm! "Leider" läuft es bei mir unter W2K und Linux fehlerfrei.

Zum Screenshot: Parallel scheinen die Linien nicht zu sein. Es sieht eher so aus, als würde die Kurve oszillieren. Nach links werden die Abstände immer geringer. Wird Dir erstmal nichts anderes übrig bleiben, als eine Wertetabelle auszugeben, um zu sehen, ob der Fehler bereits beim Rechnen oder erst bei den Tkinter-Funktionen geschieht. Am Besten mal in eine Datei ausgeben:

Code: Alles auswählen

def draw_curve(f):
	"""Zeichnet die Kurve der angegebenen Funktion"""
	for tg in f.L:							#Teilgraphen
		file = open("wertetabelle","w")
		for (x,y) in tg: file.write("%s %s\n"%(x,y))
		file.close()
		canv.create_line([umr(koord) for koord in tg],fill="red", tags="f"+str(id(f)))
Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

das schaut mir eher nach einem Overflow-Error aus, welche tk-version ist denn installiert?


Gruß

Dookie
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Voges hat geschrieben: Zum Screenshot: Parallel scheinen die Linien nicht zu sein. Es sieht eher so aus, als würde die Kurve oszillieren. Nach links werden die Abstände immer geringer. Wird Dir erstmal nichts anderes übrig bleiben, als eine Wertetabelle auszugeben, um zu sehen, ob der Fehler bereits beim Rechnen oder erst bei den Tkinter-Funktionen geschieht. Am Besten mal in eine Datei ausgeben:
Die WErtetabelle stimmt noch.
Die Linien sind auch nicht parallel:
der Teil des Graphen, der nicht sichtbar ist, wird nach oben in den sichtbaren BEreich verschoben. Da Die Kurve im Extrem immer steiler wird, werden die Abschnitte auch immer steiler und näher beieinanderliegend.
das schaut mir eher nach einem Overflow-Error aus, welche tk-version ist denn installiert?
Weiß ich nicht... Ich würde sagen, die, die aktuell bei Python mitgeliefert wird :lol:
Hab Win98SE als OS, falls das hilft.

Ansonsten nochmal danke für eure TEsts.
Ich denke mal, ich kann jetzt wohl davon ausgehen, dass mein Programm richtig funktioniert (die gute Nachricht) aber mein Computer ein Problem hat (die schlechte Nachricht)
Antworten