2017-12-14 2 views
0

Ich arbeite in einem Projekt, das einen Graphen dynamisch zeichnen muss, wie die Eingaben in einer Tkinter Spinbox geändert wird.Plot Graph mit Pyplot mit Eingabe von Tkinter Spinbox

Ich habe einen Beispielcode:

from tkinter import * 
from tkinter import font 
from tkinter.font import Font 
from tkinter import messagebox 
print("'Tkinter' module is found as tkinter.") 

import matplotlib 
matplotlib.use('TkAgg') 
import matplotlib.pyplot as plt 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.backend_bases import key_press_handler 
from matplotlib.figure import Figure 
print("Importing matplotlib from libraries.") 


master = Tk() 

def ok(x_val=1000,y_val=20): 
     fig = Figure(figsize=(5,5),dpi=70) 
     ax = fig.subplots() 
     ax.set_title("Right Ear") 
     ax.set_ylabel("db HL") 
     ax.set_xlabel("Frequency") 
     ax.set_xlim(100,9000) 
     ax.set_ylim(130,-10) 
     ax.set_facecolor("#ffd2d2") 

     x = [125,250,500,1000,2000,4000,8000] 
     ticks = [125,250,500,"1K","2K","4K","8K"] 
     xm = [750,1500,3000,6000] 

     ax.set_xscale('log', basex=2) 
     ax.set_xticks(x) 
     ax.set_xticks(xm, minor=True) 
     ax.set_xticklabels(ticks) 
     ax.set_xticklabels([""]*len(xm), minor=True) 


     ax.yaxis.set_ticks([120,110,100,90,80,70,60,50,40,30,20,10,0,-10]) 


     ax.plot([x_val],[y_val],'r+',markersize=15.0,mew=2) 
     ax.grid(color="grey") 
     ax.grid(axis="x", which='minor',color="grey", linestyle="--") 
     canvas = FigureCanvasTkAgg(fig, master=master) 
     canvas.show() 
     canvas.get_tk_widget().grid(column=0,row=2,columnspan=3,rowspan=15) 

def action(): 
     print(spin.get()) 
     canvas.draw() 
     ok(spin.get(),10) 

spin = Spinbox(master, from_=125,to=8000,command=action) 
spin.grid(column=5,row=2) 

ok() 

Dieser Code nicht den Plot ändern, kann ich nicht verstehen, wie es zu ändern, um genau zu sein, wie canvas.draw() hier zu nutzen, um die Arbeit zu tun. Die Spinbox hat einen Wertebereich von 125 bis 8000. Ich konnte nicht herausfinden, wie man den Spinbox-Wert jedes Mal ändert (kann command= verwenden, aber implementieren) und ihn der x-Achse von ax.plot() zuführen und dynamisch plotten. Wenn sich der Wert von "spinbox" ändert, ändert sich auch der Plot in die neue Position und entfernt den vorherigen Plot von der vorherigen Position.

Antwort

0

Sie müssen die von Ihnen benötigten Variablen verfügbar machen. Ein üblicher Ansatz besteht darin, eine Klasse zu verwenden und diese Klassenvariablen zu erstellen. Auf diese kann dann innerhalb der Klasse (self) oder außerhalb als Attribute zugegriffen werden.

from Tkinter import * 

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 

class PlotClass(): 
    def __init__(self): 
     fig = Figure(figsize=(5,5),dpi=70) 
     ax = fig.subplots() 
     ax.set_title("Right Ear") 
     ax.set_ylabel("db HL") 
     ax.set_xlabel("Frequency") 
     ax.set_xlim(100,9000) 
     ax.set_ylim(130,-10) 
     ax.set_facecolor("#ffd2d2") 

     x = [125,250,500,1000,2000,4000,8000] 
     ticks = [125,250,500,"1K","2K","4K","8K"] 
     xm = [750,1500,3000,6000] 

     ax.set_xscale('log', basex=2) 
     ax.set_xticks(x) 
     ax.set_xticks(xm, minor=True) 
     ax.set_xticklabels(ticks) 
     ax.set_xticklabels([""]*len(xm), minor=True) 

     ax.yaxis.set_ticks([120,110,100,90,80,70,60,50,40,30,20,10,0,-10]) 

     self.line, = ax.plot([],[],'r+',markersize=15.0,mew=2) 
     ax.grid(color="grey") 
     ax.grid(axis="x", which='minor',color="grey", linestyle="--") 
     self.canvas = canvas = FigureCanvasTkAgg(fig, master=master) 
     canvas.show() 
     canvas.get_tk_widget().grid(column=0,row=2,columnspan=3,rowspan=15) 
     self.spin = Spinbox(master, from_=125,to=8000,command=self.action) 
     self.spin.grid(column=5,row=2) 

    def ok(self, x=1000,y=20): 
     self.line.set_data([x],[y]) 
     self.canvas.draw_idle() 

    def action(self): 
     self.ok(float(self.spin.get()),10) 

master = Tk() 
plotter = PlotClass() 
plotter.ok(125,10) 
master.mainloop() 
+0

Ich fragte eine andere Frage basierend auf @ImportanceOfBeingErnest Ihre Antwort. [hier] (https://stackoverflow.com/questions/47843511/plotting-lines-with-pyclot-when-button-clicked-with-values-from-tkinter-spinbox?noredirect=1&lq=1) –