Jupyter notebook: let a user inputs a drawing

Question:

Simple question but I’m not able to find something out there…

Is there a simple and user friendly tool that can be used within a jupyter-notebook to let the user draw something in black on a white space (let say of size (x,y) pixels) after running a cell?

The drawing has to be returned (or even temporarily saved) as an array/image which can then be used by numpy for example.

Asked By: s.k

||

Answers:

you can do that using PIL and tkinter libraries, like:

from PIL import ImageTk, Image, ImageDraw
import PIL
from tkinter import *

width = 200  # canvas width
height = 200 # canvas height
center = height//2
white = (255, 255, 255) # canvas back

def save():
    # save image to hard drive
    filename = "user_input.jpg"
    output_image.save(filename)

def paint(event):
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    canvas.create_oval(x1, y1, x2, y2, fill="black",width=5)
    draw.line([x1, y1, x2, y2],fill="black",width=5)

master = Tk()

# create a tkinter canvas to draw on
canvas = Canvas(master, width=width, height=height, bg='white')
canvas.pack()

# create an empty PIL image and draw object to draw on
output_image = PIL.Image.new("RGB", (width, height), white)
draw = ImageDraw.Draw(output_image)
canvas.pack(expand=YES, fill=BOTH)
canvas.bind("<B1-Motion>", paint)

# add a button to save the image
button=Button(text="save",command=save)
button.pack()

master.mainloop()

You can modify the save function to read the image using PIL and numpy to have it as an numpy array.
hope this helps!

Try ipycanvas with interactive drawing mode.
It actually has a demo notebook with interactive drawing that could be easily modified to do exactly what you want. It also has numpy support.

Answered By: Jonathan Oesterle

There is a discussion on jupyterlab’s github page on this issue: https://github.com/jupyterlab/jupyterlab/issues/9194. Apparently, it is planned to add Excalidraw at some point and until then, https://github.com/nicknytko/notebook-drawing was recommended.

Answered By: TheIdealis