#!/usr/bin/python from Tkinter import * from tkColorChooser import askcolor import tkFileDialog, tkSimpleDialog from interpret_fractal import * from thread import start_new_thread from datetime import datetime from random import randrange mailpass = "" draw_root = 0 draw_frame = 0 draw_canvas = 0 canvas_line_thickness = 1 def convert_color(color): return "#%02x%02x%02x"%tuple([c*255 for c in color]) bias = (0,0) # Bias is an ugly hack, but it's workshop time in less than 12 hours def canvas_draw_line(x1, y1, x2, y2, color=(0, 0, 0)): w, h = draw_root.winfo_width(), draw_root.winfo_height() x1 += w/2 + bias[0] x2 += w/2 + bias[0] y1 = -y1 + h/2 + bias[1] y2 = -y2 + h/2 + bias[1] draw_canvas.create_line(int(x1), int(y1), int(x2), int(y2), fill=convert_color(color), width=canvas_line_thickness) draw_canvas.update() def canvas_init(thickness, background): global canvas_line_thickness canvas_line_thickness = thickness draw_canvas.config(background=convert_color(background)) def clear_window(): global draw_canvas, draw_root, draw_frame draw_root.destroy() draw_root = 0 draw_frame = 0 draw_canvas = 0 print "Ok, a new window should be made next time" def snowstorm(fractal, flakes): global bias draw_in_other(fractal) # try: xhalf = draw_root.winfo_width()/2 yhalf = draw_root.winfo_height()/2 for i in range(int(flakes)-1): x = randrange(-xhalf, xhalf) y = randrange(-yhalf, yhalf) bias = (x,y) draw_in_other(fractal) bias = (0,0) # except: # print "Couldn't convert flakes to integer" def draw_in_other(fractal): global draw_canvas, draw_root, draw_frame # if bias == (0,0): # open("backup_"+str(datetime.now()).replace(" ","_") + ".ff", "w").write(fractal) if not draw_canvas: draw_root = Tk() w,h = draw_root.winfo_screenwidth(), root.winfo_screenheight() draw_root.geometry("%dx%d+0+0" % (w,h)) draw_root.title("Frozen Fractals Drawing Window") draw_canvas = Canvas(draw_root) draw_canvas.pack(fill='both', expand=1) draw_canvas.update() draw_root.protocol("WM_DELETE_WINDOW", clear_window) draw_fractal(fractal, canvas_draw_line, canvas_init) def save_image(filename): if draw_root: from PIL import Image draw_canvas.postscript(file="tmp.eps") img = Image.open("tmp.eps").convert("RGB") bgcolor = draw_canvas.winfo_rgb(draw_canvas["background"]) pixdata = img.load() for y in xrange(img.size[1]): for x in xrange(img.size[0]): if pixdata[x, y] == (255, 255, 255): pixdata[x, y] = bgcolor img.save("filename" + ".png" if not "png" in filename else filename, "png") def mail_image(): if not draw_root: return import smtplib from os.path import basename from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.utils import * save_image("tmp.png") toaddr = tkSimpleDialog.askstring("Enter e-mail address: ", "Enter e-mail address: ") fromaddr = 'ffractals@gmail.com' username = 'ffractals@gmail.com' msg = MIMEMultipart( From=fromaddr, To=toaddr, Date=formatdate(localtime=True), Subject="Frozen Fractals" ) msg['Subject'] = "Your Fractals" msg['From'] = "Frozen Fractals" msg.attach(MIMEText("Fractal is attached.\nhttp://isoptera.lcsc.edu/~seth/frozenfractals/\n")) imga = MIMEImage(open("tmp.png", "rb").read()) imga.add_header('Content-Disposition', 'attachment', filename="fractal.png") msg.attach(imga) server = smtplib.SMTP('smtp.gmail.com:587') server.ehlo() server.starttls() server.login(username, mailpass) server.sendmail(fromaddr, toaddr, msg.as_string()) server.quit() class FFUI(Frame): def __init__(self, master): Frame.__init__(self, master) self.pack(fill='both', expand=1) self.textwindow = Frame(self) self.controls = Frame(self) self.controls.pack(side=RIGHT) self.textwindow.pack(side=LEFT, fill='both', expand=1) self.editor = Text(self.textwindow) self.editor.pack(fill='both', expand=1) # self.turtle_button = Button(self.controls, text="Draw Fractal\n(Animated)", command=self.turtle) # self.turtle_button.pack() Button(self.controls, text="Draw Fractal", command=lambda:draw_in_other(self.editor.get(1.0, "end"))).pack() Button(self.controls, text="Draw Snowstorm", command=lambda:snowstorm(self.editor.get(1.0, "end"), tkSimpleDialog.askstring("How Many Flakes?", "How Many Flakes?"))).pack() Button(self.controls, text="Open File", command=self.open_file).pack() Button(self.controls, text="Save Fractal", command=self.save_file).pack() Button(self.controls, text="Save Image", command=lambda : save_image(tkFileDialog.asksaveasfilename())).pack() Button(self.controls, text="E-mail Image", command=mail_image).pack() Button(self.controls, text="Inner Color", command=lambda : self.color("insidecolor", askcolor())).pack() Button(self.controls, text="Outer Color", command=lambda : self.color("outsidecolor", askcolor())).pack() Button(self.controls, text="Background Color", command=lambda : self.color("backgroundcolor", askcolor())).pack() Button(self.controls, text="Enter Defaults", command=self.show_default).pack() Button(self.controls, text="Forward",command=lambda : self.editor.insert("end", "forward 100\n")).pack() Button(self.controls, text="left",command=lambda : self.editor.insert("end", "right 90\n")).pack() Button(self.controls, text="right",command=lambda : self.editor.insert("end", "left 90\n")).pack() def show_default(self): defaults = {"x":"500", "y":"500", "level":"0", "mode":"a", "sides":"6", "backgroundcolor":"0 0 0", "outsidecolor":"1 1 1 ", "insidecolor":"0.4 0 1", "size":"80", "line":"2"} text = self.editor.get("1.0", "end") for key in defaults: if key in text: continue self.editor.insert(1.0, key + " " + defaults[key] + "\n") def color(self, term, color): cstring = "" for c in color[0]: cstring += str(float(c)/255.0) cstring += " " self.editor.insert("1.0", term + " " + cstring + "\n" ) def turtle(self): run_with_turtle(self.editor.get(1.0, "end")) def open_file(self): self.editor.delete(1.0, "end") self.editor.insert(1.0, tkFileDialog.askopenfile(mode='r').read()) def save_file(self): tkFileDialog.asksaveasfile(mode='w', defaultextension="ff").write(self.editor.get(1.0, "end")) root = Tk() w,h = root.winfo_screenwidth(), root.winfo_screenheight() root.geometry("%dx%d+0+0" % (w,h)) root.title("Frozen Fractals") ffui = FFUI(root) root.mainloop()