Seite 1 von 1
Verfasst: Samstag 26. Mai 2007, 12:17
von schlangenbeschwörer
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.
Verfasst: Sonntag 27. Mai 2007, 00:09
von Michael Schneider
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?
Grüße,
der Michel
Verfasst: Sonntag 27. Mai 2007, 15:46
von Tommy
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
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.