Я хотел бы сделать экземпляр изображения в блокноте jupyter, чтобы реагировать на события щелчка - как мы можем это сделать? Я также хочу иметь возможность идентифицировать изображение, которое было нажато. Это просто сделать с помощью кнопок, но не изображений.
Как сделать изображение ipywidgets кликабельным?
Ответы (4)
%%javascript
let kernel = IPython.notebook.kernel;
kernel.execute("on_image_click()");
or
может даже вернуть распечатанные данные из python
%%javascript
let callback = {
iopub: {
// have a look at data on console for its structure
output: (data) => {console.log(data)}}
}
};
let kernel = IPython.notebook.kernel;
kernel.execute("on_image_click()", callback);
Поиграв с этим, единственный способ, которым я мог это сделать, - использовать некоторый javascript... в коде python у меня есть что-то вроде:
from ipywidgets import Image
from IPython.display import display, Javascript
im = Image(value=open(filename, 'rb').read())
im.add_class('the_image_class')
def on_image_click():
#do something....
return
#Now, I wrote some javascript(jQuery) code like this...
js = ''' $(".the_image_class").on("click", function(e){
var kernel = IPython.notebook.kernel;
kernel.execute("on_image_click()");
});'''
#then, run the javascript...
display(Javascript(js))
Какой-то смысл полностью использовать виджеты в python... Есть ли лучший способ связать функции python с событиями виджетов без javascript?
Другие ответы я считаю взломом (внедрение JavaScript на страницу не рекомендуется и может не работать в JupyterLab).
Вы можете посмотреть ipyevents: https://github.com/mwcraig/ipyevents
Он позволяет добавлять прослушиватели событий к любому виджету и разработан мейнтейнером core-ipywidgets.
Я не отвечаю прямо на вопрос, но я наткнулся на этот вопрос при решении аналогичной проблемы, возможно, мое решение будет кому-то полезно. Я хотел зацикливать изображения в ячейке ноутбука jupyter по щелчку. На самом деле я был бы в порядке с любым взаимодействием, таким как кнопка или даже повторный запуск ячейки. Я стремился к наименьшему количеству кода, потому что это было для презентации, и я не хотел беспокоить свою аудиторию 30 строками javascript только для того, чтобы зациклить некоторые изображения. Итак, это решение, которое перебирает ваши изображения при нажатии Shift+Enter.
# Import and set a counter in one cell
from IPython.display import Markdown; slide = 0
# Loop images in a different cell
if not os.path.isfile('img{}.jpg'.format(slide)): slide = 0
slide +=1; Markdown("""<img src="img{}.jpg" style="height:100px">""".format(slide-1))