lolamontes69

Python/ A simple Vector graphics program

May 16th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.40 KB | None | 0 0
  1. #!/usr/bin/python
  2. from Tkinter import *
  3. import Tkinter as tk
  4. from tkFileDialog import askopenfilename
  5. from tkFileDialog import asksaveasfilename
  6.  
  7.  
  8. class Vector_Images(object):
  9.     """ Creates Vector Images """
  10.  
  11.     width=1
  12.     spline = 0
  13.     points = []
  14.     tag1 = "theline"
  15.     b1 = "up"
  16.     xold, yold = None, None
  17.     factor = 1
  18.  
  19.     def point(self, event):
  20.         self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white") # to make points disappear add 'outline="white"'
  21.         self.points.append(event.x)
  22.         self.points.append(event.y)
  23.  
  24.     def draw_a_rectangle(self):
  25.         self.points = []
  26.         self.c.bind("<Button-1>", self.rectangle)
  27.  
  28.     def rectangle(self, event):
  29.         self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white")
  30.         self.points.append(event.x)
  31.         self.points.append(event.y)
  32.         try:
  33.             self.rec1 = self.c.create_rectangle(self.points[0], self.points[1], self.points[2], self.points[3], outline="black", width=self.width)
  34.             self.points = []
  35.  
  36.         except:
  37.             return self.points
  38.  
  39.     def draw_an_oval(self):
  40.         self.points = []
  41.         self.c.bind("<Button-1>", self.oval)
  42.        
  43.  
  44.     def oval(self, event):
  45.         self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white")
  46.         self.points.append(event.x)
  47.         self.points.append(event.y)
  48.         try:
  49.             self.oval1 = self.c.create_oval(self.points[0], self.points[1], self.points[2], self.points[3], outline="black", width=self.width)
  50.             self.points = []
  51.         except:
  52.             return self.points
  53.  
  54.     def graph(self, event):
  55.         self.joined1 = self.c.create_line(self.points, tags="theline", width=self.width)
  56.  
  57.  
  58.     def toggle(self, event):
  59.         if self.spline == 0:
  60.             self.c.itemconfigure(self.tag1, smooth=1)
  61.             self.spline = 1
  62.         elif self.spline == 1:
  63.             self.c.itemconfigure(self.tag1, smooth=0)
  64.             self.spline = 0
  65.  
  66.     def eraser(self):
  67.         self.points = []
  68.         self.c.bind("<Motion>", self.motion)
  69.         self.c.bind("<ButtonPress-1>", self.b1down)
  70.         self.c.bind("<ButtonRelease-1>", self.b1up)
  71.  
  72.     def b1down(self, event):
  73.         self.b1 = "down"           # you only want to draw when the button is down
  74.                           # because "Motion" events happen -all the time-
  75.  
  76.     def b1up(self, event):
  77.  
  78.         self.b1 = "up"
  79.         self.xold = None           # reset the line when you let go of the button
  80.         self.yold = None
  81.  
  82.     def motion(self, event):
  83.         if self.b1 == "down":
  84.             if self.xold is not None and self.yold is not None:
  85.                 event.widget.create_line(self.xold,self.yold,event.x,event.y,smooth=TRUE, width=self.width, fill="white")
  86.                           # here's where you draw it. smooth. neat.
  87.             self.xold = event.x
  88.             self.yold = event.y
  89.  
  90.     def join_the_dots(self):
  91.         self.points = []
  92.         self.c.bind("<Button-1>", self.point)
  93.         self.c.bind("<Button-3>", self.graph)
  94.         self.c.bind("<Button-2>", self.toggle)
  95.  
  96.     def draw_a_line(self):
  97.         self.points = []
  98.         self.c.bind("<Button-1>", self.draw_a_line1)
  99.  
  100.  
  101.     def draw_a_line1(self, event):
  102.         self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white")
  103.         self.points.append(event.x)
  104.         self.points.append(event.y)
  105.         try:
  106.             line1 = self.c.create_line(self.points, tags="theline", width=self.width)
  107.             self.points = []
  108.  
  109.  
  110.         except:
  111.             return self.points
  112.  
  113.     def foobar(self, event=None):
  114.         try:
  115.             print "Tittlies"
  116.         except:
  117.             print "Tittlies"
  118.  
  119.     def about_callback(self):
  120.         try:
  121.             text1 = ""
  122.             lainey = tk.Tk()
  123.             lainey.title('About this Program.')
  124.             text1 = "\nThis is a program for\ncreating Vector graphics\n\nyayyyyyyyyyy"
  125.             lainey.config(background="black")
  126.             self.label1 = tk.Label(lainey, text=text1, background='white')
  127.             self.label1.pack(padx=5, pady=5)
  128.             lainey.mainloop()
  129.         except:
  130.             return
  131.  
  132.     def save_callback(self):
  133.         try:
  134.             saveas = asksaveasfilename(filetypes = [('All','*'),("Text",'*.txt'),("HTM", '*.htm'),("HTML",'*.html'),])
  135.             self.c.update()
  136.             self.c.postscript(file=saveas, colormode='color')
  137.         except: pass
  138.  
  139.     def new(self):
  140.         self.moot.destroy()
  141.         test = Vector_Images()
  142.         test.config_gui()
  143.  
  144.     def width_gui1(self):
  145.         try:
  146.             self.width = int(self.rose.entry1.get())
  147.         except:
  148.             return
  149.  
  150.     def width_gui(self):
  151.         try:
  152.             self.rose = tk.Tk()
  153.             self.rose.title('Width entry box.')
  154.             self.rose.label1 = tk.Label(self.rose, text='Width of line')
  155.             self.rose.label1.pack(side=TOP,padx=10,pady=10)
  156.             self.rose.entry1 = tk.Entry(self.rose, width=10)
  157.             self.rose.entry1.pack(side=TOP,padx=10,pady=10)
  158.             self.rose.button1 = tk.Button(self.rose, text='enter', command=self.width_gui1)
  159.             self.rose.button1.pack()
  160.             self.rose.mainloop()
  161.         except:
  162.             return
  163.  
  164.     def do_scale(self, event=None):
  165.         try:
  166.             self.factor = float(self.rose1.entry1.get())
  167.             (x0,y0,x1,y1) = self.c.coords(CURRENT)
  168.             (width, height) = float(x1-x0), float(y1-y0)
  169.             width = self.factor * width
  170.             height = self.factor * height
  171.             x1 = x0 + width
  172.             y1 = y0 + height
  173.             self.c.coords(CURRENT, x0,y0,x1,y1)
  174.         except:
  175.             return
  176.  
  177.  
  178.     def resize_gui(self):
  179.         try:
  180.             self.c.bind("<1>", self.do_scale)
  181.             self.rose1 = tk.Tk()
  182.             self.rose1.title('Resize entry box.')
  183.             self.rose1.label1 = tk.Label(self.rose1, text='Resize factor')
  184.             self.rose1.label1.pack(side=TOP,padx=10,pady=10)
  185.             self.rose1.entry1 = tk.Entry(self.rose1, width=10)
  186.             self.rose1.entry1.pack(side=TOP,padx=10,pady=10)
  187.             self.rose1.button1 = tk.Button(self.rose1, text='enter', command=self.do_scale)
  188.             self.rose1.button1.pack()
  189.             self.rose1.mainloop()
  190.         except:
  191.             return
  192.  
  193.     def select_and_move(self):
  194.         self.c.bind("<1>", self.mouseDown)
  195.         self.c.bind("<B1-Motion>", self.mouseMove)
  196.  
  197.     def mouseDown(self, event):
  198.     # remember where the mouse went down
  199.         self.lastx = event.x
  200.         self.lasty = event.y
  201.  
  202.     def mouseMove(self, event):
  203.     # whatever the mouse is over gets tagged as CURRENT for free by tk.
  204.         self.c.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
  205.         self.lastx = event.x
  206.         self.lasty = event.y
  207.  
  208.     def config_gui(self):
  209.         self.moot = tk.Tk()
  210.         self.moot.title("Simple Vector Graphics Editor")
  211.         self.moot.resizable(0,0)
  212.         self.moot.config(background='black')
  213.  
  214.         self.menubar = tk.Frame(self.moot, borderwidth=1, bg="black")
  215.         self.menubar.pack()
  216.         self.mb_file = tk.Menubutton(self.menubar,text='File')
  217.         self.mb_file.config(background="black", fg="red")
  218.         self.mb_file.pack(side='left')
  219.         self.mb_file.menu = tk.Menu(self.mb_file)
  220.         self.mb_file.menu.add_command(label='New...', command=self.new)
  221.         self.mb_file.menu.add_command(label='Save as...', command=self.save_callback)
  222.         self.mb_file.menu.add_command(label='Close',command=self.moot.quit)
  223.  
  224.         self.mb_actions = tk.Menubutton(self.menubar,text='Tools')
  225.         self.mb_actions.config(background="black", fg="red")
  226.         self.mb_actions.pack(side='left')
  227.         self.mb_actions.menu = tk.Menu(self.mb_actions)
  228.         self.mb_actions.menu.add_command(label="Change width", command=self.width_gui)
  229.         self.mb_actions.menu.add_command(label="Eraser", command=self.eraser)
  230.         self.mb_actions.menu.add_command(label="Draw a line", command=self.draw_a_line)
  231.         self.mb_actions.menu.add_command(label="Draw a path", command=self.join_the_dots)
  232.         self.mb_actions.menu.add_command(label="Draw a rectangle", command=self.draw_a_rectangle)
  233.         self.mb_actions.menu.add_command(label="Draw an oval", command=self.draw_an_oval)
  234.         self.mb_actions.menu.add_command(label="Move an item", command=self.select_and_move)
  235.         self.mb_actions.menu.add_command(label="Resize an item", command=self.resize_gui)
  236.  
  237.         self.mb_help = tk.Menubutton(self.menubar,text='Help')
  238.         self.mb_help.config(background="black", fg="red")
  239.         self.mb_help.pack(padx=25, side='right')
  240.         self.mb_help.menu = tk.Menu(self.mb_help)
  241.         self.mb_help.menu.add_command(label='About', command=self.about_callback)
  242.  
  243.         self.mb_file['menu'] = self.mb_file.menu
  244.         self.mb_actions['menu'] = self.mb_actions.menu
  245.         self.mb_help['menu'] = self.mb_help.menu
  246.  
  247.         self.c = tk.Canvas(self.moot, bg="white", width=400, height= 400)
  248.         self.c.configure(cursor="crosshair")
  249.         self.c.pack()
  250.         self.c.bind("<Button-1>", self.foobar) # Put default mouse binds here
  251.         self.c.bind("<Button-3>", self.foobar)
  252.         self.c.bind("<Button-2>", self.foobar)
  253.         self.moot.mainloop()
  254.  
  255. test = Vector_Images()
  256. test.config_gui()
  257.  
  258. """ A simple vector images program using Tkinter
  259. """
Advertisement
Add Comment
Please, Sign In to add comment