Gebe ich bei dem Funktionsplotter wie er unten steht die Funktion mit Startwert, Endwert und Genauigkeit ein und drücke den plot - Button tut sich gar nichts.
Ändere ich allerdings den command vom button von
Code: Alles auswählen
command = lambda: plot
Code: Alles auswählen
command = self.plot
AttributeError: App instance has no attribute 'plot'
Wenn ihr Ideen habt immer her damit
Außerdem kommt nach einer gewissen Zeit, in der das Programm läuft immer die Meldung Windows Runtime Error.
Wär cool wenn ihr mir dabei auch helfen könntet.
Hier mein Programmcode:
Code: Alles auswählen
import matplotlib.pyplot as plt
import numpy as np
import Tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
import parser
import re
REPLACE_DIC = {'sin' : 'np.sin',
'arcsin' : 'np.arcsin',
'sinh' : 'np.sinh',
'arcsinh' : 'np.arcsinh',
'cos' : 'np.cos',
'arccos' : 'np.arccos',
'cosh' : 'np.cosh',
'arccosh' : 'np.arccosh',
'tan' : 'np.tan',
'arctan' : 'np.arctan',
'tanh' : 'np.tanh',
'arctanh' : 'np.arctanh',
'ln' : 'np.log',
'log' : 'np.log',
'log10' : 'np.log10',
'log2' : 'np.log2',
'exp' : 'np.exp',
'^' : '**',
'sqrt' : 'np.sqrt',
'pi' : 'np.pi',
'PI' : 'np.pi',
}
class App():
def __init__(self, master):
self.master = master
self.initUI()
def initUI(self):
self.master.title("Funktionsplotter")
self.label_funktion = Tkinter.Label(self.master, text = "Funktion")
self.label_funktion.grid(row = 0, column = 0)
self.entry_funktion = Tkinter.Entry(self.master, width = 50)
self.entry_funktion.grid(row = 0, column = 1)
self.label_startwert = Tkinter.Label(self.master, text = "Startwert der Funktion")
self.label_startwert.grid(row = 2, column = 0)
self.entry_startwert = Tkinter.Entry(self.master, width = 15)
self.entry_startwert.grid(row = 3, column = 0)
self.label_endwert = Tkinter.Label(self.master, text = "Endwert der Funktion")
self.label_endwert.grid(row = 4, column = 0)
self.entry_endwert = Tkinter.Entry(self.master, width = 15)
self.entry_endwert.grid(row = 5, column = 0)
self.label_genauigkeit = Tkinter.Label(self.master, text = "Abstand zwischen zu berechnenden Punkten")
self.label_genauigkeit.grid(row = 6, column = 0)
self.entry_genauigkeit = Tkinter.Entry(self.master, width = 15)
self.entry_genauigkeit.grid(row = 7, column = 0)
self.plot_button = Tkinter.Button(self.master, text = "Funktion Plotten", command = lambda:plot)
self.plot_button.grid(row = 0, column = 4)
fig = plt.figure()
canvas = FigureCanvasTkAgg(fig, master=self.master)
toolbar = NavigationToolbar2TkAgg(canvas, self.master)
canvas.get_tk_widget().grid(row=3, column=1)
toolbar.grid(row=7, column=1)
def formel_berechnen(self,):
self.x = np.arrange(float(entry_startwert.get()),
float(entry_endwert.get()),
float(entry_genauigkeit.get()))
x = self.x
formula_raw = self.formula.get().replace('e^x', 'exp(x)')
formula_list = re.split('(\W)', formula_raw_exp)
formula_replace = [REPLACE_DIC.get(item,item) for item in formula_list]
formula_finish = ''.join(formula_replace)
form = parser.expr(formula_finish).compile()
try:
self.y = eval(form)
self.legend = self.formula.get()
except NameError:
self.y = np.sin(self.x)
self.legend = 'sin(x)'
return (self.x,self.y,self.legend)
def plot(self):
self.formel_berechnen(0.01)
plt.clf()
plt.plot(self.x,self.y, label=self.legend)
plt.grid('on')
plt.legend()
plt.gcf().canvas.draw()
def main():
root = Tkinter.Tk()
app = App(root)
root.mainloop()
if __name__ == '__main__':
main()