Наложение других элементов графического интерфейса поверх видео GStreamer - PullRequest
0 голосов
/ 14 октября 2011

У меня есть проект, построенный на Python, PyGTK 2.24 и PyGST (GStreamer). У меня есть мое видео отлично работает в объекте gtk.DrawingArea.

Однако мне нужно отображать другие элементы GUI НАД этим видео во время его воспроизведения. (Пожалуйста, не спрашивай почему, просто поверь мне.) Прямо сейчас, они все, кажется, позади. В коде видеообъекты (и gtk.DrawingArea) объявляются и помещаются в gtk.Fixed FIRST, следуя всему остальному.

Итак, как мне это сделать? Нужно ли менять объект, на котором играет GStreamer? Я знаю, что это возможно ... Я видел программы GStreamer, в верхней части видео на которых расположены такие кнопки, как кнопки и метки.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 24 мая 2013

Вероятно, бесполезно для OP, но я долго искал способ разместить виджеты поверх элемента gtk.gdk.Drawable (который может быть статически нарисованным изображением, анимацией или видео) до того, как Я наконец понял, как это сделать в pygtk2.

Вот ссылка на то, что я придумал: http://bazaar.launchpad.net/~damien-moore/picty/trunk/view/642/modules/picty/overlay_widgets.py

Это включает в себя 3 пользовательских класса:

ProportionalLayout: реализация пользовательского gtk.Container, который позволяет пользователю позиционировать дочерние виджеты с использованием пропорций.

DrawableOverlay: EventBox, который генерирует событие 'draw' для пользователя, чтобы подключиться и рисовать, и отображает ProportionalLayout сверху.

DrawableOverlayHover: DrawableOverlayHover, который показывает виджеты, только если указатель становится «близко» к ним.

Пример основной программы иллюстрирует, как их использовать. Код должен быть достаточно простым для адаптации к видеоприложению.

2 голосов
/ 14 октября 2011

Вы можете сделать это в GTK 3.2 и более поздних версиях, используя GtkOverlay.

Если вы не можете выполнить обновление, вот краткое изложение устаревшего способа: подключитесь кexpose-event сигнал DrawingArea и нарисуйте информацию на себе, используя Каир.Когда информация изменится, запустите перерисовку области рисования, используя widget.queue_draw().Убедитесь, что ваш обработчик запускает после обработчик, который рисует фактическое видео в области рисования.Это будет работать для меток и неинтерактивных элементов графического интерфейса.

Если вы хотите, чтобы реально функционирующий элемент графического интерфейса завис над вашим видео, это довольно сложно, и я не знаю, как это сделать.Я не думаю, что Fixed гарантирует какой-либо z-порядок.Я подозреваю, что ваши кнопки и еще много чего перезаписываются видео, отображаемым в области рисования, поэтому, возможно, сработает перерисовка тех, что в вашем обработчике expose-event сработают.

...