Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Made this program before I got out of my import * habit
- from tkinter import *
- class SaveAsWindow:
- '''Simple window, enter filename, and press save to export the canvas as a post script file viewable in acrobat'''
- def remove_window(self):
- '''Destroys the window'''
- self.parent.saving = False
- self.save_window.destroy()
- def save(self):
- '''Saves the cavas as a ps file'''
- self.file_name = self.entry.get()
- save_file = self.parent.canvas.postscript(file = self.file_name + ".ps")
- self.parent.saving = False
- self.save_window.destroy()
- def __init__(self, parent):
- '''Creates the window'''
- self.parent = parent
- if parent.saving == False:
- parent.saving = True
- self.save_window = Tk()
- self.save_window.title("Save as...")
- self.file_name = ""
- self.entry = Entry(self.save_window)
- self.save_button = Button(self.save_window, text = "save", command = self.save)
- self.entry.grid(column = 0, row = 0)
- self.save_button.grid(column = 1, row = 0)
- self.save_window.protocol("WM_DELETE_WINDOW", self.remove_window)
- class Palate:
- '''A window containing a grid of buttons to change the brush color'''
- def remove_palate(self):
- '''Destroys the window'''
- self.parent.palate = False
- self.color_grid.destroy()
- def __init__(self, parent):
- '''Creates the window'''
- self.parent = parent
- if parent.palate == False:
- parent.palate = True
- self.color_grid = Tk()
- self.black_button = Button(self.color_grid, bg="black", width = 3, command = lambda: self.parent.set_color("black"))
- self.red_button = Button(self.color_grid, bg="red", width = 3, command = lambda: self.parent.set_color("red"))
- self.blue_button = Button(self.color_grid, bg="blue", width = 3, command = lambda: self.parent.set_color("blue"))
- self.green_button = Button(self.color_grid, bg="green", width = 3, command = lambda: self.parent.set_color("green"))
- self.purple_button = Button(self.color_grid, bg="purple", width = 3, command = lambda: self.parent.set_color("purple"))
- self.yellow_button = Button(self.color_grid, bg="yellow", width = 3, command = lambda: self.parent.set_color("yellow"))
- self.orange_button = Button(self.color_grid, bg="orange", width = 3, command = lambda: self.parent.set_color("orange"))
- self.hot_pink_button = Button(self.color_grid, bg="hot pink", width = 3, command = lambda: self.parent.set_color("hot pink"))
- self.teal_button = Button(self.color_grid, bg="teal", width = 3, command = lambda: self.parent.set_color("teal"))
- self.brown_button = Button(self.color_grid, bg="saddle brown", width = 3, command = lambda: self.parent.set_color("brown"))
- self.grey_button = Button(self.color_grid, bg="dark grey", width = 3, command = lambda: self.parent.set_color("dark grey"))
- self.lgreen_button = Button(self.color_grid, bg="lime green", width = 3, command = lambda: self.parent.set_color("lime green"))
- self.sblue_button = Button(self.color_grid, bg="sky blue", width = 3, command = lambda: self.parent.set_color("sky blue"))
- self.tan_button = Button(self.color_grid, bg="tan", width = 3, command = lambda: self.parent.set_color("tan"))
- self.ygreen_button = Button(self.color_grid, bg="yellow green", width = 3, command = lambda: self.parent.set_color("yellow green"))
- self.white_button = Button(self.color_grid, bg="white", width = 3, command = lambda: self.parent.set_color("white"))
- self.black_button.grid(row = 0, column = 0)
- self.red_button.grid(row = 0, column = 1)
- self.blue_button.grid(row = 0, column = 2)
- self.teal_button.grid(row = 0, column = 3)
- self.green_button.grid(row = 1, column = 0)
- self.purple_button.grid(row = 1, column = 1)
- self.yellow_button.grid(row = 1, column = 2)
- self.brown_button.grid(row = 1, column = 3)
- self.orange_button.grid(row = 2, column = 0)
- self.hot_pink_button.grid(row = 2, column = 1)
- self.white_button.grid(row = 2, column = 2)
- self.grey_button.grid(row = 2, column = 3)
- self.lgreen_button.grid(row = 3, column = 0)
- self.sblue_button.grid(row = 3, column = 1)
- self.tan_button.grid(row = 3, column = 2)
- self.ygreen_button.grid(row = 3, column = 3)
- self.color_grid.protocol("WM_DELETE_WINDOW", self.remove_palate)
- class MainWindow:
- def close_all(self):
- '''Closes all windows'''
- if self.palate:
- self.palate_window.remove_palate()
- if self.saving:
- self.save_window.remove_window()
- self.root.destroy()
- def set_color(self, new_color):
- '''Sets the brush color to the chosen color'''
- self.color = new_color
- def reduce_size(self):
- '''Reduces the brush size by 2 if possible'''
- if self.size > 2:
- self.size -= 2
- self.size_text.set(self.size)
- def increase_size(self):
- '''Increases the brush size by 2'''
- self.size += 2
- self.size_text.set(str(self.size))
- def set_size(self, int_size):
- '''Sets the brush to the requested size'''
- self.size = int_size
- self.size_text.set(str(int_size))
- def enable_draw(self, event):
- '''Sets up the necessary variables to begin drawing on the canvas'''
- size = self.size
- x, y = event.x, event.y
- self.last_x, self.last_y = x, y
- self.brush_down = True
- self.actions.append(self.canvas.create_oval(x-(size/2), y-(size/2), x+(size/2), y+(size/2), outline = self.color, fill = self.color))
- def disable_draw(self, event):
- '''Disables canvas drawing'''
- self.brush_down = False
- def update(self, event):
- '''If you are not drawing, display the cursor, otherwise, draw a line from the last x,y to the new x,y'''
- size = self.size
- x, y = event.x, event.y
- try:
- self.canvas.delete(self.cursor)
- finally:
- if not self.brush_down:
- if self.color != "white":
- self.cursor = self.canvas.create_oval(x-(size/2), y-(size/2), x+(size/2), y+(size/2), outline = self.color)
- else:
- self.cursor = self.canvas.create_oval(x-(size/2), y-(size/2), x+(size/2), y+(size/2), outline = "black")
- else:
- self.actions.append(self.canvas.create_line(x, y, self.last_x, self.last_y, width=size, fill = self.color))
- self.actions.append(self.canvas.create_oval(x-(size/2), y-(size/2), x+(size/2), y+(size/2), outline = self.color, fill = self.color))
- self.last_x, self.last_y = x, y
- def remove_cursor(self, event):
- '''Remove the cursor'''
- self.canvas.delete(self.cursor)
- def clear_canvas(self, event):
- '''Clear all drawn objects on the canvas'''
- self.canvas.delete(ALL)
- def save_window(self, event):
- '''Create the save window'''
- self.save_window = SaveAsWindow(self)
- def create_palate(self, event):
- '''Create the palate window'''
- self.palate_window = Palate(self)
- def check_brush_empty(self):
- '''Checks if the user failed to input a new size'''
- num = self.size_display.get()
- if num == "":
- self.size_text.set(self.size)
- def check_brush_change(self, event):
- '''Checks if the user input a size that is invalid'''
- num = self.size_display.get()
- if num != "":
- try:
- num = int(num)
- if num >= 1:
- self.set_size(num)
- else:
- self.size_text.set(size)
- except:
- self.size_text.set(size)
- else:
- self.root.after(2000, check_brush_empty)
- def __init__(self):
- '''Sets up the window'''
- self.root = Tk()
- self.color = "black"
- self.size = 10
- self.size_text = StringVar()
- self.size_text.set(self.size)
- self.brush_down = False
- self.palate = False
- self.saving = False
- self.actions = []
- self.cursor = 0
- self.last_x, self.last_y = 0, 0
- self.palate_button = Button(self.root, text = "Create Palate", fg = "blue")
- self.clear_button = Button(self.root, text = "Clear")
- self.save_button = Button(self.root, text = "Save")
- self.minus_size = Button(self.root, text = "<", command = self.reduce_size, width = 15)
- self.size_display = Entry(self.root, textvariable = self.size_text, justify = CENTER)
- self.add_size = Button(self.root, text = ">", command = self.increase_size, width = 15)
- self.reset_size = Button(self.root, text = "Reset Brush", command = lambda: self.set_size(10))
- self.canvas = Canvas(self.root, bg = "white", height = 500, width = 500, cursor="none")
- self.clear_button.grid(row = 0, column = 0, sticky = W+E)
- self.save_button.grid(row = 0, column = 1, sticky = W+E)
- self.palate_button.grid(row = 1, column = 0, sticky = W+E)
- self.minus_size.grid(row = 1, column = 2, sticky = W)
- self.size_display.grid(row = 1, column = 3, sticky = E+W)
- self.add_size.grid(row = 1, column = 4, sticky = E)
- self.reset_size.grid(row=0, column = 2, columnspan = 3, sticky = W+E)
- self.canvas.grid(row = 2, column = 0, columnspan = 5, sticky = W+E)
- self.canvas.bind('<Motion>', self.update)
- self.canvas.bind('<ButtonPress-1>', self.enable_draw)
- self.canvas.bind('<ButtonRelease-1>', self.disable_draw)
- self.canvas.bind('<Leave>', self.remove_cursor)
- self.clear_button.bind('<Button-1>', self.clear_canvas)
- self.save_button.bind('<Button-1>', self.save_window)
- self.palate_button.bind('<Button-1>', self.create_palate)
- self.size_display.bind('<KeyRelease>', self.check_brush_change)
- self.root.protocol("WM_DELETE_WINDOW", self.close_all)
- app = MainWindow()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement