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()