Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- from Tkinter import *
- import Tkinter as tk
- from tkFileDialog import askopenfilename
- from tkFileDialog import asksaveasfilename
- class Vector_Images(object):
- """ Creates Vector Images """
- width=1
- spline = 0
- points = []
- tag1 = "theline"
- b1 = "up"
- xold, yold = None, None
- factor = 1
- def point(self, event):
- self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white") # to make points disappear add 'outline="white"'
- self.points.append(event.x)
- self.points.append(event.y)
- def draw_a_rectangle(self):
- self.points = []
- self.c.bind("<Button-1>", self.rectangle)
- def rectangle(self, event):
- self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white")
- self.points.append(event.x)
- self.points.append(event.y)
- try:
- self.rec1 = self.c.create_rectangle(self.points[0], self.points[1], self.points[2], self.points[3], outline="black", width=self.width)
- self.points = []
- except:
- return self.points
- def draw_an_oval(self):
- self.points = []
- self.c.bind("<Button-1>", self.oval)
- def oval(self, event):
- self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white")
- self.points.append(event.x)
- self.points.append(event.y)
- try:
- self.oval1 = self.c.create_oval(self.points[0], self.points[1], self.points[2], self.points[3], outline="black", width=self.width)
- self.points = []
- except:
- return self.points
- def graph(self, event):
- self.joined1 = self.c.create_line(self.points, tags="theline", width=self.width)
- def toggle(self, event):
- if self.spline == 0:
- self.c.itemconfigure(self.tag1, smooth=1)
- self.spline = 1
- elif self.spline == 1:
- self.c.itemconfigure(self.tag1, smooth=0)
- self.spline = 0
- def eraser(self):
- self.points = []
- self.c.bind("<Motion>", self.motion)
- self.c.bind("<ButtonPress-1>", self.b1down)
- self.c.bind("<ButtonRelease-1>", self.b1up)
- def b1down(self, event):
- self.b1 = "down" # you only want to draw when the button is down
- # because "Motion" events happen -all the time-
- def b1up(self, event):
- self.b1 = "up"
- self.xold = None # reset the line when you let go of the button
- self.yold = None
- def motion(self, event):
- if self.b1 == "down":
- if self.xold is not None and self.yold is not None:
- event.widget.create_line(self.xold,self.yold,event.x,event.y,smooth=TRUE, width=self.width, fill="white")
- # here's where you draw it. smooth. neat.
- self.xold = event.x
- self.yold = event.y
- def join_the_dots(self):
- self.points = []
- self.c.bind("<Button-1>", self.point)
- self.c.bind("<Button-3>", self.graph)
- self.c.bind("<Button-2>", self.toggle)
- def draw_a_line(self):
- self.points = []
- self.c.bind("<Button-1>", self.draw_a_line1)
- def draw_a_line1(self, event):
- self.c.create_oval(event.x, event.y, event.x+1, event.y+1, fill="white")
- self.points.append(event.x)
- self.points.append(event.y)
- try:
- line1 = self.c.create_line(self.points, tags="theline", width=self.width)
- self.points = []
- except:
- return self.points
- def foobar(self, event=None):
- try:
- print "Tittlies"
- except:
- print "Tittlies"
- def about_callback(self):
- try:
- text1 = ""
- lainey = tk.Tk()
- lainey.title('About this Program.')
- text1 = "\nThis is a program for\ncreating Vector graphics\n\nyayyyyyyyyyy"
- lainey.config(background="black")
- self.label1 = tk.Label(lainey, text=text1, background='white')
- self.label1.pack(padx=5, pady=5)
- lainey.mainloop()
- except:
- return
- def save_callback(self):
- try:
- saveas = asksaveasfilename(filetypes = [('All','*'),("Text",'*.txt'),("HTM", '*.htm'),("HTML",'*.html'),])
- self.c.update()
- self.c.postscript(file=saveas, colormode='color')
- except: pass
- def new(self):
- self.moot.destroy()
- test = Vector_Images()
- test.config_gui()
- def width_gui1(self):
- try:
- self.width = int(self.rose.entry1.get())
- except:
- return
- def width_gui(self):
- try:
- self.rose = tk.Tk()
- self.rose.title('Width entry box.')
- self.rose.label1 = tk.Label(self.rose, text='Width of line')
- self.rose.label1.pack(side=TOP,padx=10,pady=10)
- self.rose.entry1 = tk.Entry(self.rose, width=10)
- self.rose.entry1.pack(side=TOP,padx=10,pady=10)
- self.rose.button1 = tk.Button(self.rose, text='enter', command=self.width_gui1)
- self.rose.button1.pack()
- self.rose.mainloop()
- except:
- return
- def do_scale(self, event=None):
- try:
- self.factor = float(self.rose1.entry1.get())
- (x0,y0,x1,y1) = self.c.coords(CURRENT)
- (width, height) = float(x1-x0), float(y1-y0)
- width = self.factor * width
- height = self.factor * height
- x1 = x0 + width
- y1 = y0 + height
- self.c.coords(CURRENT, x0,y0,x1,y1)
- except:
- return
- def resize_gui(self):
- try:
- self.c.bind("<1>", self.do_scale)
- self.rose1 = tk.Tk()
- self.rose1.title('Resize entry box.')
- self.rose1.label1 = tk.Label(self.rose1, text='Resize factor')
- self.rose1.label1.pack(side=TOP,padx=10,pady=10)
- self.rose1.entry1 = tk.Entry(self.rose1, width=10)
- self.rose1.entry1.pack(side=TOP,padx=10,pady=10)
- self.rose1.button1 = tk.Button(self.rose1, text='enter', command=self.do_scale)
- self.rose1.button1.pack()
- self.rose1.mainloop()
- except:
- return
- def select_and_move(self):
- self.c.bind("<1>", self.mouseDown)
- self.c.bind("<B1-Motion>", self.mouseMove)
- def mouseDown(self, event):
- # remember where the mouse went down
- self.lastx = event.x
- self.lasty = event.y
- def mouseMove(self, event):
- # whatever the mouse is over gets tagged as CURRENT for free by tk.
- self.c.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
- self.lastx = event.x
- self.lasty = event.y
- def config_gui(self):
- self.moot = tk.Tk()
- self.moot.title("Simple Vector Graphics Editor")
- self.moot.resizable(0,0)
- self.moot.config(background='black')
- self.menubar = tk.Frame(self.moot, borderwidth=1, bg="black")
- self.menubar.pack()
- self.mb_file = tk.Menubutton(self.menubar,text='File')
- self.mb_file.config(background="black", fg="red")
- self.mb_file.pack(side='left')
- self.mb_file.menu = tk.Menu(self.mb_file)
- self.mb_file.menu.add_command(label='New...', command=self.new)
- self.mb_file.menu.add_command(label='Save as...', command=self.save_callback)
- self.mb_file.menu.add_command(label='Close',command=self.moot.quit)
- self.mb_actions = tk.Menubutton(self.menubar,text='Tools')
- self.mb_actions.config(background="black", fg="red")
- self.mb_actions.pack(side='left')
- self.mb_actions.menu = tk.Menu(self.mb_actions)
- self.mb_actions.menu.add_command(label="Change width", command=self.width_gui)
- self.mb_actions.menu.add_command(label="Eraser", command=self.eraser)
- self.mb_actions.menu.add_command(label="Draw a line", command=self.draw_a_line)
- self.mb_actions.menu.add_command(label="Draw a path", command=self.join_the_dots)
- self.mb_actions.menu.add_command(label="Draw a rectangle", command=self.draw_a_rectangle)
- self.mb_actions.menu.add_command(label="Draw an oval", command=self.draw_an_oval)
- self.mb_actions.menu.add_command(label="Move an item", command=self.select_and_move)
- self.mb_actions.menu.add_command(label="Resize an item", command=self.resize_gui)
- self.mb_help = tk.Menubutton(self.menubar,text='Help')
- self.mb_help.config(background="black", fg="red")
- self.mb_help.pack(padx=25, side='right')
- self.mb_help.menu = tk.Menu(self.mb_help)
- self.mb_help.menu.add_command(label='About', command=self.about_callback)
- self.mb_file['menu'] = self.mb_file.menu
- self.mb_actions['menu'] = self.mb_actions.menu
- self.mb_help['menu'] = self.mb_help.menu
- self.c = tk.Canvas(self.moot, bg="white", width=400, height= 400)
- self.c.configure(cursor="crosshair")
- self.c.pack()
- self.c.bind("<Button-1>", self.foobar) # Put default mouse binds here
- self.c.bind("<Button-3>", self.foobar)
- self.c.bind("<Button-2>", self.foobar)
- self.moot.mainloop()
- test = Vector_Images()
- test.config_gui()
- """ A simple vector images program using Tkinter
- """
Advertisement
Add Comment
Please, Sign In to add comment