Plot von Matplotlib durch Interrupt (eines Tasters) erneuern

Fragen zu Tkinter.
Antworten
Python1234
User
Beiträge: 9
Registriert: Mittwoch 18. September 2013, 16:31

Hallo,

ich habe folgendes Problem. Über einen Taster wird ein Interrupt ausgelöst, der einen Parameter verändert. Durch das Ändern des Parameters soll der Graf gleichzeitig aktualisiert werden. Im Moment habe ich das einfach so programmiert, dass wenn der Taster gedrückt wird, der komplette Graf neu erstellt wird und über den alten gezeichnet wird. Doch dann dauert es immer sehr lange, bis der neue Graf angezeigt wird.

Hat jemand eine Idee, wie man den alten Graf nicht komplett überschreibt, sondern nur die Linie neu plotten lässt, damit der neue Graf schneller angezeigt werden kann?

In der Anzeige, in der der Parameter verändert wird, benutzt man sowas wie .config... gibt es soetwas auch für den plot? Habe auch irgendwas mit line, gelesen, aber bin nicht schlau daraus geworden.

Wäre super, wenn mir jemand weiterhelfen könnte =)
BlackJack

@Python1234: Schau Dir mal die Beispiele für Animationen auf der Matplotlib-Webseite an.
Python1234
User
Beiträge: 9
Registriert: Mittwoch 18. September 2013, 16:31

Danke für den Hinweis. Habe jetzt auch ein Programm gefunden, das so ähnlich funktioniert, wie ich das will, nämlich dieses hier:

Code: Alles auswählen

from pylab import *
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.IN)

ion()
i = 0
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
draw()
while True:
	if  GPIO.input(23):
		i=i+0.1
		line.set_ydata(sin(x+i/10.0))  # update the data
		line.set_xdata(x+i)
		draw()                         # redraw the canvas
Mein Problem ist jetzt, dass mein Diagramm im Tkinter GUI eingebunden ist und es meine Tkinter GUI öffnet, aber das Diagramm in einem extra Fenster öffnet und ich es nicht hinbekomme, dass es in dem Fenster vom Tkinter das Diagramm malt. Drückt man auf den Knopf, führt das Programm auch nichts aus... ich denke das Problem liegt am ion(), aber ohne diesen Befehl macht das Programm nichts.

Nun aber mein Programmcode:

Code: Alles auswählen

import matplotlib
matplotlib.use('TkAgg')

from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import Tkinter as Tk
import RPi.GPIO as GPIO
from pylab import *

GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.IN)

ion()

i=0

def Knopf1(Diagramm_erneuern):
	global i
	i=i+0.1
	a.line.set_ydata(sin(x+i/10.0))  # update the data
	a.line.set_xdata(x+i)
	canvas.draw()
	

# Interrupt Event hinzufuegen. Pin 23, auf steigende Flanke reagieren und ISR "Interrupt" deklarieren
GPIO.add_event_detect(23, GPIO.RISING, callback = Knopf1, bouncetime = 2)   

# GUI
root = Tk.Tk()

f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
x = arange(0,2*pi,0.01) 
y = sin(x)


a.line, = plot(x,y)


# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)


Tk.mainloop()
Irgendwelche Ideen, was ich falsch mache?!? Vielen Dank im Vorraus, für eure Antwort.
Python1234
User
Beiträge: 9
Registriert: Mittwoch 18. September 2013, 16:31

also ich habs jetzt so weit, dass es erneuert, aber das Gridfenster verschiebt es und löscht die alte Linie. Hat dazu jemand eine Idee????

Code: Alles auswählen

import matplotlib
matplotlib.use('TkAgg')

from numpy import arange, sin, pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import Tkinter as Tk
import RPi.GPIO as GPIO
from pylab import *

GPIO.setmode(GPIO.BOARD)
GPIO.setup(23, GPIO.IN)


i=0

def Knopf1(Diagramm_erneuern):
        global i
        global x
        global y
        i=i+0.1
        y = sin(x+i/10.0)  # update the data
        x = x+i

        canvas.restore_region(background)
        line[0].set_data(x,y)
        a.draw_artist(line[0])
        canvas.blit(a.bbox)
       
       
GPIO.add_event_detect(23, GPIO.RISING, callback = Knopf1, bouncetime = 200)  

# GUI
root = Tk.Tk()

f = Figure(figsize=(5,4), dpi=100)
a = f.add_subplot(111)
x = arange(0,2*pi,0.01)
y = sin(x)


line=a.plot(x,y)


# a tk.DrawingArea
canvas = FigureCanvasTkAgg(f, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
background=canvas.copy_from_bbox(a.bbox)


Tk.mainloop() 
Antworten