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.
Problem mit Programm; Speicher überlauf
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hi Tommy,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.
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()
Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
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.
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.