Записная книжка Jupyter: позволяет пользователю вводить чертеж

#python #jupyter-notebook #user-input

#python #jupyter-notebook #пользовательский ввод

Вопрос:

Простой вопрос, но я не могу что-то там найти…

Есть ли простой и удобный инструмент, который можно использовать в jupyter-notebook , чтобы позволить пользователю рисовать что-то черным на пробелах (скажем, размером (x, y) пикселей) после запуска ячейки?

Чертеж должен быть возвращен (или даже временно сохранен) в виде массива / изображения, которое затем может быть использовано numpy , например.

Комментарии:

1. Возможно, holoviews для этого можно использовать библиотеку.

Ответ №1:

вы можете сделать это с помощью PIL и tkinter библиотек, таких как:

 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()
  

Вы можете изменить save функцию, чтобы считывать изображение с помощью PIL и numpy иметь его в виде numpy массива.
надеюсь, это поможет!

Комментарии:

1. Приятно, это помогло, да. Но если рисовать слишком быстро, линия отображается пунктирной, чего я не хочу. Я также исправил некоторые небольшие ошибки и экспортировал изображение, используя черно-белый режим, поскольку мне не нужны 3 канала (я добавил PIL.image.new() URL документации в коде для всех доступных режимов).

2. да, я заметил ту же проблему при написании кода, я не мог придумать, как это изменить, единственное решение, которое я мог придумать до сих пор, — медленно перемещать мышь при рисовании, пожалуйста, держите меня в курсе, если вы найдете какой-либо @s.k

3. Должно ли это работать в ноутбуке, работающем в облаке? Я получаю TclError: no display name and no $DISPLAY environment variable

Ответ №2:

Попробуйте ipycanvas с интерактивным режимом рисования. На самом деле у него есть демонстрационный ноутбук с интерактивным рисунком, который можно легко модифицировать, чтобы делать именно то, что вы хотите. Он также имеет поддержку numpy.

Ответ №3:

На странице jupyterlab в github обсуждается этот вопрос:https://github.com/jupyterlab/jupyterlab/issues/9194. По-видимому, планируется добавить Excalidraw в какой-то момент, и до тех пор,https://github.com/nicknytko/notebook-drawing было рекомендовано.