2012-04-03 9 views
2

Lieber programmming communauty,Interaktive Handlung basiert auf Tkinter und matplotlib

Ich versuche, eine „interaktive Handlung“ auf Tkinter und pylab.plot um 1D Werte zu plotten Basis auszuführen. Die Absssisse ist ein 1D-Nummernfeld x, und die Ordonatenwerte sind in einem Multidimensionsfeld Y, z.

import numpy 
x = numpy.arange(0.0,3.0,0.01) 
y = numpy.sin(2*numpy.pi*x) 
Y = numpy.vstack((y,y/2)) 

Ich mag y anzuzeigen oder y/2 (die Elemente der Matrix Y) nach x und Wechsel zwischen ihnen mit 2 Tasten links und rechts (um komplexere Fälle zu gehen). Normalerweise erstelle ich einige Funktionen wie die folgenden, um Graphen zu zeichnen.

import pylab 
def graphic_plot(n): 
    fig = pylab.figure(figsize=(8,5)) 
    pylab.plot(x,Y[n,:],'x',markersize=2) 
    pylab.show() 

zwei Tasten So fügen Sie den Wert von n Parameter zu ändern, ich habe dies ohne Erfolg versucht:

import Tkinter 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
class App: 
def __init__(self,master): 
    # Create a container 
    frame = Tkinter.Frame(master) 
    frame.pack() 
    # Create 2 buttons 
    self.button_left = Tkinter.Button(frame,text="<",command=self.decrease) 
    self.button_left.pack(side="left") 
    self.button_right = Tkinter.Button(frame,text=">",command=self.increase) 
    self.button_right.pack(side="left") 
    self.canvas = FigureCanvasTkAgg(fig,master=self) 
    self.canvas.show() 
def decrease(self): 
    print "Decrease" 
def increase(self): 
    print "Increase" 
root = Tkinter.Tk() 
app = App(root) 
root.mainloop() 

Kann mir jemand helfen zu verstehen, wie diese Art von Funktion zu erfüllen? Danke vielmals.

+0

Welche Fehler erhalten Sie? Könnten Sie näher ausführen "Ich habe das ohne Erfolg versucht"? – mgilson

+0

Erstens kann ich Grafik und Schaltflächen nicht in ein einzelnes Fenster einschließen. Zweitens weiß ich nicht, wie man den Wert von 'n' mit den Tasten ändert. Drittens, ich weiß nicht, wie man den Graphen "auffrischt", nachdem man auf den Knopf geklickt hat. – user1187727

+0

Ich weiß nicht, über einige von denen, aber um die Leinwand zu zeigen, müssen Sie es packen. Etwas herum googeln, Es scheint, als ob du willst: 'canvas.get_tk_widget() .pack (side = Tkinter.TOP, fill = Tkinter.BOTH, expand = 1)' - oder wie auch immer du es packen willst. (Ich benutze normalerweise .grid(), also bin ich mir nicht sicher, welche sinnvollen Optionen zu übergeben sind.) Packet()) – mgilson

Antwort

3

Um die y-Werte der Linie zu ändern, speichern Sie das Objekt, das beim Plotten zurückgegeben wird (line, = ax.plot(...)), und verwenden Sie dann line.set_ydata(...). Um das Diagramm neu zu zeichnen, verwenden Sie canvas.draw().

Als vollständigeres Beispiel basiert auf dem Code:

import Tkinter 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
from matplotlib.figure import Figure 

class App: 
    def __init__(self, master): 
     # Create a container 
     frame = Tkinter.Frame(master) 
     # Create 2 buttons 
     self.button_left = Tkinter.Button(frame,text="< Decrease Slope", 
             command=self.decrease) 
     self.button_left.pack(side="left") 
     self.button_right = Tkinter.Button(frame,text="Increase Slope >", 
             command=self.increase) 
     self.button_right.pack(side="left") 

     fig = Figure() 
     ax = fig.add_subplot(111) 
     self.line, = ax.plot(range(10)) 

     self.canvas = FigureCanvasTkAgg(fig,master=master) 
     self.canvas.show() 
     self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1) 
     frame.pack() 

    def decrease(self): 
     x, y = self.line.get_data() 
     self.line.set_ydata(y - 0.2 * x) 
     self.canvas.draw() 

    def increase(self): 
     x, y = self.line.get_data() 
     self.line.set_ydata(y + 0.2 * x) 
     self.canvas.draw() 

root = Tkinter.Tk() 
app = App(root) 
root.mainloop() 
+0

Das ist fast was Ich will. Vielen Dank. Kannst du mir diese Syntax 'self.line, =' (speziell das Komma) erklären? Und damit habe ich die matplotlib-Tools verloren (wie Zoom ...), gibt es eine Möglichkeit, sie zurückzubringen? – user1187727

+0

Ist es möglich, getrennte Fenster zu haben (eines mit klassischem Plot in pylab und eines zweites mit nur zwei Buttons), um dieses Ding einfacher anpassen zu können? – user1187727