Allerdings kommt etwa 5 sekunden nachdem das Programm und die Python shell beendet wurden (normal über das rote x ) ein Runtime Error. Wodran liegt das?
Hier mein code:
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',
'exp' : 'np.exp',
'^' : '**',
'sqrt' : 'np.sqrt',
'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: f(x)")
self.label_funktion.grid(row = 0, column = 0)
self.entry_funktion = Tkinter.Entry(self.master, width = 150)
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 = 2, column = 1)
self.label_endwert = Tkinter.Label(self.master, text = "Endwert der Funktion:")
self.label_endwert.grid(row = 3, column = 0)
self.entry_endwert = Tkinter.Entry(self.master, width = 15)
self.entry_endwert.grid(row = 3, column = 1)
self.label_genauigkeit = Tkinter.Label(self.master, text = "Abstand zwischen zu berechnenden Punkten:")
self.label_genauigkeit.grid(row = 4, column = 0)
self.entry_genauigkeit = Tkinter.Entry(self.master, width = 15)
self.entry_genauigkeit.grid(row = 4, column = 1)
self.plot_button = Tkinter.Button(self.master, text = "Funktion plotten", command = self.plot)
self.plot_button.grid(row = 0, column = 4)
self.hinzufueg_button = Tkinter.Button(self.master, text = "Zum Plot hinzufügen", command = self.hinzufuegen)
self.hinzufueg_button.grid(row = 2, column = 4)
fig = plt.figure()
canvas = FigureCanvasTkAgg(fig, master=self.master)
toolbar = NavigationToolbar2TkAgg(canvas, self.master)
canvas.get_tk_widget().grid(row=5, column=1)
toolbar.grid(row=7, column=1)
def formel_berechnen(self,):
self.x = np.arange(float(self.entry_startwert.get()),
float(self.entry_endwert.get()),
float(self.entry_genauigkeit.get()))
x = self.x
formula_raw = self.entry_funktion.get().replace('e^x', 'exp(x)')
formula_raw_exp = formula_raw.replace('e^', 'exp')
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.entry_funktion.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()
plt.clf()
plt.plot(self.x,self.y, label=self.legend)
plt.grid('on')
plt.xlabel('x - Achse')
plt.ylabel('y - Achse')
plt.legend()
plt.gcf().canvas.draw()
def hinzufuegen(self):
self.formel_berechnen()
plt.plot(self.x,self.y, label=self.legend)
plt.legend()
plt.gcf().canvas.draw()
def main():
root = Tkinter.Tk()
app = App(root)
root.mainloop()
if __name__ == '__main__':
main()