Plotter
Verfasst: Mittwoch 15. Juli 2009, 17:12
Hallo,
kann mir jemand sagen, warum mein Programm immer in der endlos Schleife (die eigentlich abbrechen sollte) hängen bleibt?
kann mir jemand sagen, warum mein Programm immer in der endlos Schleife (die eigentlich abbrechen sollte) hängen bleibt?
Code: Alles auswählen
from xturtle import Turtle,mainloop
from Tkinter import Button, Listbox, BooleanVar, Radiobutton, StringVar, Entry,\
DoubleVar
from tkColorChooser import askcolor
def krange(start,stop,step=1.0):
liste01=[]
element=float(start)
if step<0:
element,stop = stop,element
step=step*-1.0
while element<stop:
liste01.append(element)
element=element+step
return liste01
class Point(Turtle):
'''
x,y,color,davor
'''
def __init__(self,x,y,color,davor = None):
'''
Constructor
'''
Turtle.__init__(self,shape = "blank")
self.up()
self.goto(x,y)
self.color(color)
self.dot(10)
self.speed(0)
try:
self.last1, self.last2 = davor.pos()
except AttributeError: pass
def connect(self):
#try:
ax, ay = self.pos()
self.pd()
self.goto(self.last1, self.last2)
self.goto(ax,ay)
self.up()
#except
class Plotter(Turtle):
'''
classdocs
'''
def __init__(self,x,y,mastab,maxx,maxy,genau,func,color):
'''
Constructor
'''
Turtle.__init__(self,shape="blank")
self.up()
self.speed(0)
self.goto(x,y)
self.punkte = []
self.mastab = mastab
self.connect = False
self.maxx = maxx
self.maxy = maxy
self.func = func
self.farbe = color
self.genau = genau
self.plotted = False
self.ht()
def koordsys(self):
self.tracer(False)
self.pd()
ax,ay = self.pos()
for i in krange(1,self.maxx+1,self.genau):
x,y = self.pos()
self.goto(x+self.mastab,y)
self.goto(x+self.mastab,y-10)
self.up()
self.goto(x+self.mastab,y-25)
self.write(i)
self.goto(x+self.mastab,y)
self.pd()
self.goto(ax,ay)
for i in krange(1,self.maxx+1,self.genau):
x,y = self.pos()
self.goto(x-self.mastab,y)
self.goto(x-self.mastab,y-10)
self.up()
self.goto(x-self.mastab,y-25)
self.write(-i)
self.goto(x-self.mastab,y)
self.pd()
self.goto(ax,ay)
for i in krange(1,self.maxy+1,self.genau):
x,y = self.pos()
self.goto(x,y+self.mastab)
self.goto(x-10,y+self.mastab)
self.up()
self.goto(x-25,y+self.mastab)
self.write(i)
self.goto(x,y+self.mastab)
self.pd()
self.goto(ax,ay)
for i in krange(1,self.maxy+1,self.genau):
x,y = self.pos()
self.goto(x,y-self.mastab)
self.goto(x-10,y-self.mastab)
self.up()
self.goto(x-25,y-self.mastab)
self.write(-i)
self.goto(x,y-self.mastab)
self.pd()
self.goto(ax,ay)
self.tracer(True)
def plot(self,):
davor = Point(0,100,self.farbe,None)
davor.ht()
self.punkte.append(davor)
zaehler = 0
while not fertig:
if zaehler > self.maxx:
fertig = True
else:
try: a = self.func(zaehler) * self.mastab
except ZeroDivisionError: continue
if abs(a/self.mastab) > self.maxy:
continue
davor = Point(zaehler * self.mastab,a + 100,self.farbe,davor)
self.punkte.append(davor)
zaehler += self.genau
davor = self.punkte[0]
print "fertig"
for i in krange(1,-zaehler - 1,-self.genau):
try: a = self.func(i) * self.mastab
except: continue
davor = Point(i * self.mastab,a+100,self.farbe,davor)
self.punkt.append(davor)
self.plotted = True
def connecting(self):
if self.connect:
for punkt in self.punkte:
punkt.connect()
self.connect = True
return
for punkt in self.punkte:
punkt.clear()
self.connect = False
def change_color(self,color):
for i in self.punkte:
i.color(color)
if self.connect:
for i in self.punkte:
i.connect()
self.farbe = color
class _Manager(Turtle):
'''
classdocs
'''
def __init__(self):
'''
Constructor
'''
Turtle.__init__(self,shape = "blank")
self.colormode(255)
self.up()
self.winsize(700,700)
self.speed(0)
self.mache_array()
self.cv = cv = self.getcanvas()
liste = Listbox(None)
self.listbox = cv.create_window(250,250,window = liste)
new = Button(None, text = "New",command = self.new,width = 10,height = 2)
self.new_button = cv.create_window(-300,175,window = new)
self.vorhanden = False
self.plotters = []
self.add = BooleanVar(None, False)
self.radiobutton1 = None
self.radiobutton2 = None
self.new_func = StringVar(None,value = "def f(x): return ")
self.genau = StringVar(None,value = "Genauigkeit")
self.entryWidgetfunc = None
self.entryWidgetgenau = None
self.okButton = None
self.XButton = None
self.mastab = StringVar(None, value = "Masstab")
self.zeichnen = False
self.entryBoxmaxx = None
self.entryBoxmaxy = None
self.maxx = DoubleVar(None,value = "Laenge der x-Achse")
self.maxy = DoubleVar(None,value = "Laenge der y-Achse")
def mache_array(self):
self.goto(-370,-150)
self.pd()
self.width(3)
self.color("black","grey70")
self.begin_fill()
self.goto(370,-150)
self.goto(370,-370)
self.goto(-370,-370)
self.goto(-370,-150)
self.end_fill()
def new(self):
radio = Radiobutton(None,text = "Add",value = True,variable = self.add)
self.radiobutton1 = self.cv.create_window(-300,225,window = radio)
radio = Radiobutton(None, text = "New",value = False,variable = self.add)
self.radiobutton2 = self.cv.create_window(-240,225,window = radio)
entryWidgetfunc = Entry(None,textvariable = self.new_func)
self.entryWidgetfunc = self.cv.create_window(-270,250,window = entryWidgetfunc)
entryWidgetfunc.bind("<Return>",self.zeichne)
ok = Button(None, text = "OK",command = self.zeichne)
self.okButton = self.cv.create_window(-270,280,window = ok)
x = Button(None,text = "X",command = self.kill1,background = "red",activebackground = "red",relief = "solid")
self.XButton = self.cv.create_window(-240,280,window = x)
def zeichne(self,event = None):
if (not self.vorhanden and not self.zeichnen) or not self.add:
entry = Entry(None,textvariable = self.genau)
self.entryWidgetgenau = self.cv.create_window(-125,225,window = entry)
entry = Entry(None,textvariable = self.maxx)
self.entryBoxmaxx = self.cv.create_window(-125,250,window = entry)
entry = Entry(None, textvariable = self.maxy)
self.entryBoxmaxy = self.cv.create_window(-125,275,window = entry)
entry = Entry(None, textvariable = self.mastab)
self.mastabWidget = self.cv.create_window(-125,300,window = entry)
self.zeichnen = True
return
self.maxx = float(self.maxx.get())
self.maxy = float(self.maxy.get())
self.genau = float(self.genau.get())
self.mastab = float(self.mastab.get())
farbe,unused = askcolor()
def f():
"to overwrite later"
pass
exec str(self.new_func.get())
plotter = Plotter(0,100,self.mastab,self.maxx,self.maxy,self.genau,f,farbe)
if not self.vorhanden:
plotter.koordsys()
self.vorhanden = True
plotter.plot()
self.plotters.append(plotter)
def kill1(self):
"wird gerufen nach der Erstellung eines neuen Graphen"
for ding in [self.radiobutton1,self.radiobutton2,self.entryWidgetfunc,self.XButton,self.okButton]:
self.cv.delete(ding)
ding = None
if self.entryWidgetgenau is not None:
for i in [self.entryWidgetgenau,self.entryBoxmaxx,self.entryBoxmaxy,self.mastabWidget]:
self.cv.delete(i)
i = None
if __name__ == "__main__":
_Manager()
mainloop()