Более одного объекта Audio в ячейке Jupyter (IPython) Notebook

Я пытаюсь встроить более одного объекта IPython.display.Audio в одну ячейку Jupyter Notebook, но по какой-то причине отображается только последний.

Вот простой пример:

import IPython
IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/090412-Incendios.mp3")
IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/130224-Undertow.mp3")

Это отображает только один (второй) аудио объект. В идеале я хотел бы поместить это в цикл for и отобразить несколько аудиообъектов в одной ячейке.

Любые идеи?

Примечание. Я использую Jupyter 4.0.6 с IPython 4.0.0 на Python 2.7.10.


person Oriol Nieto    schedule 09.10.2015    source источник
comment
Вы можете отобразить несколько экранных объектов в области отображения одной ячейки, многократно используя функцию IPython.display.display. См. это для примера.   -  person Taar    schedule 10.10.2015
comment
Таар, к сожалению, это не работает при использовании аудиообъектов (по крайней мере, я не мог этого понять). Спасибо хоть.   -  person Oriol Nieto    schedule 12.10.2015
comment
Я сделал это: import IPython IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/090412-Incendios.mp3")) IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/130224-Undertow.mp3")) и, кажется, работает (в Windows 7 с python 3.4 + IPython 3.2...)   -  person Taar    schedule 13.10.2015
comment
Потрясающе, это было именно так! Не могли бы вы опубликовать это как ответ? Спасибо.   -  person Oriol Nieto    schedule 13.10.2015


Ответы (1)


Команда IPython.display.Audio(...) только создает "отображаемый" объект (в данном конкретном случае объект подкласса Audio класса DisplayObject).

После этого вы можете выполнять базовые действия с таким объектом, привязанным к классу DisplayObject (и специфичные вещи, привязанные к классу Audio). Одно из этих действий заключается в отображении его с помощью функции IPython.display.display.

Таким образом, ваша конкретная цель будет достигнута с помощью следующего кода:

import IPython
IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/090412-Incendios.mp3"))
IPython.display.display(IPython.display.Audio(url="https://ccrma.stanford.edu/~urinieto/drop/130224-Undertow.mp3"))

Тот же механизм используется для отображения других типов (подклассов) объектов DisplayObject: HTML, Markdown, Math, SVG, Javascript, Video, Image и т. д. См. это для получения подробной информации.

Три вещи действительно сбивают с толку, когда вы пытаетесь сделать это в первый раз (поначалу я тоже был в замешательстве):

  • имя команды IPython.display.Audio, что как бы подразумевает, что что-то будет отображаться; это не так;

  • тот факт, что все эти мультимедийные объекты вместе называются «отображаемыми» объектами, в то время как некоторые из них на самом деле никогда не «отображаются», а просто встраиваются в дерево DOM (например, объект Javascript);

  • тот факт, что если вы создаете такой объект и не используете для него IPython.display.display, он будет автоматически отображаться стандартным интерактивным механизмом IPython, если это последнее, что было создано в ячейке; это основной источник путаницы, потому что это позволяет людям думать, что вам не нужно использовать какую-либо конкретную функцию для отображения «экранного объекта».

person Taar    schedule 13.10.2015
comment
Действительно поучительный ответ. Я бы хотел, чтобы таких было больше. - person mins; 21.03.2021