python - 无法使用 Gtk.Overlay 覆盖 Gstreamer 视频

标签 python gtk overlay pygobject

我有一个使用 Python、PyGObject (Gtk 3) 和 GStreamer (0.11) 的项目

我的应用程序中有视频,因此我使用 Gtk.Overlay 小部件,这样我就可以将其他视觉元素放在视频背景上。 (我需要这个,相信我。)(由于小部件的数量,以及这些小部件的特定定位和覆盖的需要,我使用的是 Gtk.Fixed 容器。)

但是,在将 Gtk.Overlay 对象与通过“overlay.add_overlay(widget)”添加的任何内容一起使用时,视频根本不再可见。我仍然可以听到它,但我看不到它。

代码如下。

from gi.repository import Gtk, Gdk, GdkPixbuf, GdkX11
import pango
import pygst
pygst.require('0.10')
import gst
import Trailcrest
import os, sys
import cairo
from math import pi

class Video:

    def __init__(self):

        def on_message(bus, message): 
            if message.type == gst.MESSAGE_EOS: 
                # End of Stream 
                player.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, gst.SEEK_TYPE_SET, 5000000000, gst.SEEK_TYPE_NONE, 6000000000)
            elif message.type == gst.MESSAGE_ERROR: 
                player.set_state(gst.STATE_NULL) 
                (err, debug) = message.parse_error() 
                print "Error: %s" % err, debug

        def on_sync_message(bus, message):
            if message.structure is None:
                return False
            if message.structure.get_name() == "prepare-xwindow-id":
                Gdk.threads_enter()
                Gdk.Display.get_default().sync()
                win_id = videowidget.get_property('window').get_xid()
                imagesink = message.src
                imagesink.set_property("force-aspect-ratio", True)
                imagesink.set_xwindow_id(win_id)
                Gdk.threads_leave()

        def click_me(event, data=None):
            player.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, gst.SEEK_TYPE_SET, 5000000000, gst.SEEK_TYPE_NONE, 6000000000)

        win = Gtk.Window()
        win.set_resizable(False)
        win.set_decorated(False)
        win.set_position(Gtk.WindowPosition.CENTER)

        overlay = Gtk.Overlay()
        win.add(overlay)
        overlay.show()

        videowidget = Gtk.DrawingArea()
        overlay.add(videowidget)
        videowidget.set_halign (Gtk.Align.START)
        videowidget.set_valign (Gtk.Align.START)
        videowidget.set_size_request(640, 480)
        videowidget.show()

        fixed = Gtk.Fixed()
        overlay.add_overlay(fixed)
        fixed.show()

        pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size("IMG/IMG-MPG-LOGO.png", 250, 50)
        imgMPL = Gtk.Image()
        imgMPL.set_from_pixbuf(pixbuf)
        eb_imgMPL = Gtk.EventBox()
        eb_imgMPL.set_visible_window(False)
        eb_imgMPL.add(imgMPL)
        fixed.put(eb_imgMPL, 10, 10)
        imgMPL.show()
        eb_imgMPL.show()

        win.show_all()

        # Setup GStreamer 
        player = gst.element_factory_make("playbin", "MultimediaPlayer")
        bus = player.get_bus() 
        bus.add_signal_watch() 
        bus.enable_sync_message_emission() 
        #used to get messages that GStreamer emits 
        bus.connect("message", on_message) 
        #used for connecting video to your application 
        bus.connect("sync-message::element", on_sync_message)
        player.set_property("uri", "file://" + os.getcwd() + "/VID/BGA-HABT-001.ogv")
        player.set_state(gst.STATE_PLAYING)


if __name__ == "__main__":
    Gdk.threads_enter()
    Video()
    Gtk.main()

如何解决这个小问题?

最佳答案

<强> Answer derived from GNOME Bugzilla Bug 663589, Comments 1-3.

设置通过“add_overlay”添加的任何对象的 valign 和 halign 至关重要。

因此,声明和添加 Gtk.Fixed 对象的修改代码如下。

fixed = Gtk.Fixed()

#The following two lines were added.
fixed.set_halign(Gtk.Align.START)
fixed.set_valign(Gtk.Align.START)

overlay.add_overlay(fixed)
fixed.show()

关于python - 无法使用 Gtk.Overlay 覆盖 Gstreamer 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012723/

相关文章:

python - IndexError : string index out of range on equation cleaning function

python - gtk.treeviewcolumn 不排序

html - 在图像叠加 CSS 上填充

ios - 如何在整个世界地图 iOS Swift 上向 MKMapView 添加叠加层

python - 如何使用 Python NetworkX 在有向图中找到最长的 10 条路径?

python - 使用函数和 for 循环将文本与多个文件的列表进行比较

c - GTk鼠标拖动实现

c++ - Gtk::Label 更新标签速度

matlab - 如何在 Matlab 图形中添加工具提示或叠加文本

Python 3.6 合并字典失败