Problem mit Programm; Speicher überlauf

Fragen zu Tkinter.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Samstag 26. Mai 2007, 12:17

Wenn du die Anfangsgeschwindigkeit einfach so runterregeln möchtest, das die Linie immer gleich schnell weitergezeichnet wird, kannst du bem Programmstart ja bereits eine Linie in weiß (oder wie auch immer dein Hintergrund aussieht) zeichnen und die dann langsam weiterrücken, bis sie verschwunden, also gelöscht, ist, und durch die richtige ersetzt wurde.
Wenn du ein Bild als Hintergrund hast, kannst du für die Anfangslinie auch andere Koordinaten nehmen, die außerhalb des sichtbaren Bereichs liegen.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Sonntag 27. Mai 2007, 00:09

Tommy hat geschrieben:Aber: Wenn er bei Null beginnt zu zeichnen, dann zeichnet er eben ziemlich schnell und wenn er z.B. bei Pixel 300 angekommen ist dann zeichnet er deutlich langsamer. Das zeichnen sollte in etwa zeitsynchron sein.
Hi Tommy,

hier ein kleiner Trick für gerade, vorhersagbare Graphen wie Deine; sehr performance- und speicherfreundlich: zeichne den Graphen komplett und verdecke nur den rechten, noch nicht sichtbaren Bereich mit einem hintergrundfarbenen Rechteck. Etwa so:

Code: Alles auswählen

import Tkinter as TK

iOffsetY = 150
dData = {"x":0, "item1":0}

#   Liste der T-Werte initialisieren -> TODO: aus Datei importieren
lT =  [  0, 80, 80, 160, 160, 240, 240, 320, 320, 400]

#   Liste der Y-Werte initialisieren -> TODO: aus Datei importieren
lY1 = [100, 100, -100, -100, 100, 100, -100, -100, 100, 100]

#   einfache Additionsfunktion definieren
add = lambda a, b: a+b

#   Offset einrechnen
lY1 = map(lambda a: a+iOffsetY, lY1)

#   Listenelemente mit zip paarweise und dann mit reduce zu einer Liste zusammenfuegen
lGraph1 = reduce(add, zip(lT, lY1))

#   grafische Oberflaeche aufbauen
wTk = TK.Tk()
wCanvas = TK.Canvas(wTk, width=400, height=300)
wCanvas.grid(row=0, column=0)
wCanvas.create_line(lGraph1)

def update_mask(iX, iPrevItem=0):
	#	voriges Rechteck loeschen, wenn vorhanden
	if iPrevItem:
		wCanvas.delete(iPrevItem)
	iRectItem = wCanvas.create_rectangle(iX, 0, 400, 300, fill="SystemButtonFace", outline="SystemButtonFace")
	return iRectItem

def update():
	"""Update aller Graphen alle 1/25 Sekunden"""
	if wTk.winfo_exists():
		dData["item1"] = update_mask(iX=dData["x"], iPrevItem=dData["item1"])
		dData["x"] = (dData["x"]+1)%400
		wCanvas.after(40, func=update)

update()
wTk.mainloop()
Ich denke der Code ist gut kommentiert. Noch Fragen? :D

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Tommy
User
Beiträge: 8
Registriert: Donnerstag 17. Mai 2007, 09:46

Sonntag 27. Mai 2007, 15:46

Hallo Michael.
Also das ist wirklich eine super Lösung für mein Problem, an so was hab ich noch gar nicht gedacht.
Das die Verläufe jetzt nur triviale Rechteckspannungen sind, hab ich jetzt nur so mal zum testen angenommen, die richtigen Graphen muss ich erst noch rausmessen, weil das Ding gibt es auch real 8)
Aber das ändert ja nichts daran, das ich es so machen kann wie du beschrieben hast.

Ich bin dir - und den anderen natürlich auch - überaus dankbar das ihr mir geholfen und Zeit investiert habt.
Ein großes DANKESCHÖN.

Gruß, Tommy.
Antworten