Как сделать изображение ipywidgets кликабельным?

Я хотел бы сделать экземпляр изображения в блокноте jupyter, чтобы реагировать на события щелчка - как мы можем это сделать? Я также хочу иметь возможность идентифицировать изображение, которое было нажато. Это просто сделать с помощью кнопок, но не изображений.


person Dror Hilman    schedule 02.02.2017    source источник


Ответы (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);
person Lujun Weng    schedule 13.12.2018

Поиграв с этим, единственный способ, которым я мог это сделать, - использовать некоторый 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?

person Dror Hilman    schedule 06.02.2017
comment
это не работает, что такое метод add_class? можете указать на документацию - person SML; 03.05.2020
comment
см.: github.com/jupyter-widgets/ ipywidgets/blob/ - person Dror Hilman; 04.05.2020

Другие ответы я считаю взломом (внедрение JavaScript на страницу не рекомендуется и может не работать в JupyterLab).

Вы можете посмотреть ipyevents: https://github.com/mwcraig/ipyevents

Он позволяет добавлять прослушиватели событий к любому виджету и разработан мейнтейнером core-ipywidgets.

person Martin Renou    schedule 06.03.2020

Я не отвечаю прямо на вопрос, но я наткнулся на этот вопрос при решении аналогичной проблемы, возможно, мое решение будет кому-то полезно. Я хотел зацикливать изображения в ячейке ноутбука 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))
person Paloha    schedule 27.02.2020