#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 было рекомендовано.