So, poste hier jetzt mal die neueste Version. Bei weiteren Änderungen ändere ich dann die und mach keine neue, so sollte das gehen.
Code: Alles auswählen
# fuer Hopalongs und andere Spielereien..
# by Schlangenbeschw\xf6rer
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 \xe4ndern", 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, font=("",12, "bold"))
self.algol.grid(columnspan=2, pady=5)
self.entrys={}
i=1
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].grid(row=i, column=1)
self.entrys[e].bind("<FocusOut>", 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="\xfcbernehmen",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
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,2),self.f(y,2), 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()
Einer der dümmsten Fehler war mal wieder, das ich aus ner ´normalen´ eine tk-Variable gemacht hab, und im Vergleich das ´.get()´ vergessen hab...Naja, jetzt sollte es einigermaßen laufen. Jetzt wird auch die Eingabe automatisch in floats umgewandelt.