Plotter

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
cheeta
User
Beiträge: 3
Registriert: Mittwoch 15. Juli 2009, 16:19

Hallo,

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()
Zuletzt geändert von cheeta am Mittwoch 15. Juli 2009, 17:42, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Die Einrueckung ist total kaputt, besser das bitte aus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten