Skip to content

Instantly share code, notes, and snippets.

@zmoslanov
Forked from nikhilkumarsingh/paint.py
Last active April 16, 2019 22:29
Show Gist options
  • Select an option

  • Save zmoslanov/a6b2a1dbe3660ff5ce715d28c84ac473 to your computer and use it in GitHub Desktop.

Select an option

Save zmoslanov/a6b2a1dbe3660ff5ce715d28c84ac473 to your computer and use it in GitHub Desktop.
A simple paint application using tkinter in Python 3 (added saving option an image using PIL (Image, ImageDraw))
from tkinter import *
from tkinter.colorchooser import askcolor
from PIL import Image, ImageDraw
import io
class Paint(object):
DEFAULT_PEN_SIZE = 5.0
DEFAULT_COLOR = 'black'
def __init__(self):
self.root = Tk()
self.pen_button = Button(self.root, text='pen', command=self.use_pen)
self.pen_button.grid(row=0, column=0)
self.brush_button = Button(self.root, text='brush', command=self.use_brush)
self.brush_button.grid(row=0, column=1)
self.color_button = Button(self.root, text='color', command=self.choose_color)
self.color_button.grid(row=0, column=2)
self.eraser_button = Button(self.root, text='eraser', command=self.use_eraser)
self.eraser_button.grid(row=0, column=3)
self.choose_size_button = Scale(self.root, from_=1, to=10, orient=HORIZONTAL)
self.choose_size_button.grid(row=0, column=4)
self.c = Canvas(self.root, bg='white', width=600, height=600)
self.c.grid(row=1, columnspan=5)
self.image = Image.new("RGB", (600, 600), 'white')
self.draw = ImageDraw.Draw(self.image)
self.setup()
self.root.mainloop()
def setup(self):
self.old_x = None
self.old_y = None
self.line_width = self.choose_size_button.get()
self.color = self.DEFAULT_COLOR
self.eraser_on = False
self.active_button = self.pen_button
self.c.bind('<B1-Motion>', self.paint)
self.c.bind('<ButtonRelease-1>', self.reset)
def use_pen(self):
self.activate_button(self.pen_button)
def use_brush(self):
self.activate_button(self.brush_button)
def choose_color(self):
self.eraser_on = False
self.color = askcolor(color=self.color)[1]
def use_eraser(self):
self.activate_button(self.eraser_button, eraser_mode=True)
def activate_button(self, some_button, eraser_mode=False):
self.active_button.config(relief=RAISED)
some_button.config(relief=SUNKEN)
self.active_button = some_button
self.eraser_on = eraser_mode
def paint(self, event):
self.line_width = self.choose_size_button.get()
paint_color = 'white' if self.eraser_on else self.color
if self.old_x and self.old_y:
self.c.create_line(self.old_x, self.old_y, event.x, event.y,
width=self.line_width, fill=paint_color,
capstyle=ROUND, smooth=TRUE, splinesteps=36)
self.draw.line((self.old_x, self.old_y, event.x, event.y),
width=self.line_width, fill=paint_color)
self.old_x = event.x
self.old_y = event.y
#self.ps = self.c.postscript(colormode='color')
#self.img = Image.open(io.BytesIO(self.ps.encode('utf-8')))
#self.img.save('test.jpg')
filename = "test.jpg"
self.image.save(filename)
def reset(self, event):
self.old_x, self.old_y = None, None
if __name__ == '__main__':
Paint()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment