# coding: utf-8 """ Für Hopalongs und andere Spielereien.. (c) Julian Habrock , 4/2007 bytemuehle.de """ import Tkinter as tk from math import * #die find ich grad nicht im mathmodul: def sign(x): if x != 0: return x/abs(x) else: return x ALGOS={"1. Hopalong":("y-sign(x)*(abs(b*x-c))**0.5","a-x"), "2. Gingerbreadman":("1-y+abs(x)","x"), "3. Kamtor3D": ("x*cos(a)+(x*x-y)*sin(a)","x*sin(a)-(x*x-y)*cos(a)"), "4. Own":("y","x")} class OFP: def __init__(self): self.master=tk.Tk() self.master.title("Orbit-Fraktal-Painter") self.algox=ALGOS.items()[0][0] self.algoy=ALGOS.items()[0][1] self.algoname=tk.StringVar() self.titlealgo=tk.StringVar() self.algoname.trace_variable("w", self.changetitle) self.algoname.set("1. Hopalong") self.x,self.y=None,None self.mf=tk.Frame(bg="steelblue") self.mf.grid() self.can=tk.Canvas(self.mf,height=300,width=300,bg="black") self.can.grid(row=1,column=1,rowspan=3) self.bf=tk.Frame(self.mf, bg="steelblue") self.bf.grid(row=2, column=2) self.calcbut=tk.Button(self.bf,bg="white",text="berechnen", command=self.calculate) self.calcbut.grid(pady=1.5, sticky="we") self.optbut=tk.Button(self.bf,bg="white",text="Algorithmus ändern", font=("",8,""),command=self.setalgo) self.optbut.grid(pady=0.5, sticky="we") self.newbut=tk.Button(self.bf,bg="white",text="Canvas leeren", command=self.c_reset) self.newbut.grid(pady=0.5, sticky="we") self.nvar=tk.StringVar() self.nvar.set("%i"% 0) self.indexl=tk.Label(self.mf,textvariable=self.nvar, bg="gray", relief="sunken", bd=1) self.indexl.grid(row=3,column=2) self.ef=tk.Frame(self.mf, bg="steelblue") self.ef.grid(row=1, column=2, padx=5) self.algol=tk.Label(self.ef, bg="steelblue", fg="white", textvariable=self.titlealgo) self.algol.grid(columnspan=2, pady=5) self.entrys={} i = 1 defaults = iter(["-0.25", "-0.6", "-1.7", "500"]) for e in ("a","b","c","num"): tk.Label(self.ef,text=e+":", bg="steelblue", fg="white").grid( row=i, column=0) self.entrys[e]=tk.Entry(self.ef) self.entrys[e].insert(0, defaults.next()) self.entrys[e].grid(row=i, column=1) self.entrys[e].bind("", self.makefloat) i+=1 def setalgo(self): print "setalog" self.optop=tk.Toplevel(self.master) self.af=tk.Frame(self.optop,bg="steelblue") self.af.grid(ipadx=5,ipady=5) self.cbl=tk.Label(self.af, bg="gray",relief="sunken",borderwidth=2) self.cbl.grid(row=0,column=0,columnspan=2,sticky="we",padx=5,pady=5) ralgos=ALGOS.keys() ralgos.sort() i=0 for algoname in ralgos: tk.Radiobutton(self.cbl,text=algoname,bg="gray",fg="black", activebackground="gray",activeforeground="black", variable=self.algoname, value=algoname, command=self.refresh).grid(row=i,column=0,sticky="w") i+=1 self.xlab=tk.Label(self.af,text="xx:",bg="steelblue",fg="white") self.xlab.grid(row=1,column=0) self.xent=tk.Entry(self.af) self.xent.grid(row=1,column=1) self.ylab=tk.Label(self.af,text="yy:",bg="steelblue",fg="white") self.ylab.grid(row=2,column=0,padx=5) self.yent=tk.Entry(self.af) self.yent.grid(row=2,column=1,padx=5) self.obok=tk.Button(self.af,bg="white",text="übernehmen", command=self.newconfig) self.obok.grid(row=3,column=0,columnspan=2,sticky="we",padx=5,pady=5) self.refresh() def refresh(self,event=None): algo=ALGOS[self.algoname.get()] self.xent.delete(0,"end") self.xent.insert(0,algo[0]) self.yent.delete(0,"end") self.yent.insert(0,algo[1]) self.newconfig() def newconfig(self): si=self.algoname.get() if (not(self.xent.get() == ALGOS[si][0] and self.yent.get() == ALGOS[si][1])): ALGOS["Own"]=(self.xent.get(),self.yent.get()) self.algoname.set("Own") self.algox,self.algoy=ALGOS[si][0],ALGOS[si][1] self.algoindex=si def makefloat(self,event): e=event.widget t=e.get().replace(",",".") try: if e==self.entrys["num"]: f=str(int(t)) else: f=str(float(t)) except ValueError: f="" print "Falsche Eingabe: Bitte nur Zahlen eingeben!" e.delete(0,"end") e.insert("end", f) def calculate(self): a,b,c = (float(self.entrys["a"].get()), float(self.entrys["b"].get()), float(self.entrys["c"].get())) n=int( self.entrys["num"].get()) # if self.x and self.y: # x,y=self.x,self.y # else: # x,y=0,0 x,y=0,0 self.color="red" ci=2500 for i in range(n): if not (i%10): self.nvar.set(("%i"% (int(self.nvar.get())+10)).rjust(5)) if 2*ci > i >= 1*ci: self.color="magenta" elif 3*ci > i >= 2*ci: self.color="blue" elif 4*ci > i >= 3*ci: self.color="green" elif 5*ci > i >= 4*ci: self.color="cyan" elif 6*ci > i >= 5*ci: self.color="yellow" elif 8*ci > i >= 6*ci: self.color="white" elif 9*ci > i >= 7*ci: self.color="gray" self.can.create_oval(self.f(x,1),self.f(y,1),self.f(x,3), self.f(y,3), fill=self.color) self.can.update() if self.algoname.get() == "1. Hopalong": xx=y-sign(x)*(abs(b*x-c))**0.5 yy=a-x elif self.algoname.get()== "2. Gingerbreadman": xx=1-y+abs(x) yy=x elif self.algoname.get() == "3. Kamtor3D": xx=x*cos(a)+(x*x-y)*sin(a) yy=x*sin(a)-(x*x-y)*cos(a) else: xx=eval(self.algox) yy=eval(self.algoy) x,y=xx,yy self.x,self.y=x,y def f(self,x,index): return ((x*10)+150)-1.000001+index def c_reset(self): for child in self.can.find_all(): self.can.delete(child) def changetitle(self, *args): self.titlealgo.set(self.algoname.get().split()[1]) OFP().master.mainloop()