Search code examples
pythonjupyter-notebookuser-input

Jupyter notebook: let a user inputs a drawing


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.


Solution

  • 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!