PIL+Canvas: Anfägerproblem
Verfasst: Montag 4. Juni 2007, 16:07
Hallo!
Da mein Orbit Fraktal Painter recht langsam war und immer langsamer wurde. (tk.Canvas is halt recht ungeeignet um >10.000 Punkte einzeln zu zeichnen...)
Deswegen wollt ich das jezt mal mit der PIL probieren, aber PIL ist ja recht mächtig und da ich bis jetzt noch nix damit gemacht hab, wollt ich erst mal langsam anfangen, da ich erstmal nur zeichnen will.
Meine Hilfsklasse zum einfachen zeichen mit PIL:
der Abschnitt des Hauptprogramms:
Am restlichen Code hab ich nix gemacht (is also getestet).
So, nun meine Probleme:
2. Find ich ganz komisch, denn wenn ich in der _update-Methode das self.im.show() auskommentiere, erscheint kurz vor dem von ´´show()´´ erzeugten Bild, eins im Canvas, was jedoch nachher wieder weg ist. Ebenso, wenn self.im.show() auskommentiert ist...
Ich hoffe, ihr könnt mir helfen.
LG, jj
Da mein Orbit Fraktal Painter recht langsam war und immer langsamer wurde. (tk.Canvas is halt recht ungeeignet um >10.000 Punkte einzeln zu zeichnen...)
Deswegen wollt ich das jezt mal mit der PIL probieren, aber PIL ist ja recht mächtig und da ich bis jetzt noch nix damit gemacht hab, wollt ich erst mal langsam anfangen, da ich erstmal nur zeichnen will.
Meine Hilfsklasse zum einfachen zeichen mit PIL:
Code: Alles auswählen
import Image, ImageDraw, ImageTk
# Klasse, um einfach mit pil auf ein tk.Canvas zu zeichnen
class PILCanvas(tk.Canvas):
def __init__(self,master,pilx,pily, width, height,pilw, pilh, bg):
self.pilx, self.pily = pilx, pily
tk.Canvas.__init__(self,master, width = width, height = height, bg = bg)
self.im = Image.new("1", size = (pilw,pilh), color = bg)
self.draw = ImageDraw.Draw(self.im)
image = ImageTk.PhotoImage(self.im)
self.create_image(pilx,pily,image=image,tags="image1", anchor = "nw")
def pilpoint(self, pos, fill):
self.draw.point(pos, fill = fill)
def _update(self):
print "update"
self.delete("image1")
image = ImageTk.PhotoImage(self.im)
self.create_image(self.pilx, self.pily,image=image,tags="image1", anchor = "nw")
self.update()
# self.im.show()
Code: Alles auswählen
# in der __init__:
self.can=PILCanvas(self.mf,height=300,width=300,bg="black", pilx = 0, pily = 0, pilw = 300, pilh = 300)
self.can.grid(row=1,column=1,rowspan=3)
#später:
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='#ff4242'
elif 3*ci > i >= 2*ci:
self.color='#f5ff42'
elif 4*ci > i >= 3*ci:
self.color='#4bff42'
elif 5*ci > i >= 4*ci:
self.color='#42f5ff'
elif 6*ci > i >= 5*ci:
self.color='#4448fd'
elif 8*ci > i >= 6*ci:
self.color='#d943fe'
elif 9*ci > i >= 7*ci:
self.color='#fe4356'
self.can.pilpoint((self.f(x),self.f(y)), 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
self.can._update()
def f(self,x):
return ((x*10)+150)
So, nun meine Probleme:
- Punkte sind nicht farbig
- Darstellen auf Canvas funzt nicht
2. Find ich ganz komisch, denn wenn ich in der _update-Methode das self.im.show() auskommentiere, erscheint kurz vor dem von ´´show()´´ erzeugten Bild, eins im Canvas, was jedoch nachher wieder weg ist. Ebenso, wenn self.im.show() auskommentiert ist...
Ich hoffe, ihr könnt mir helfen.
LG, jj