在GStreamer视频上覆盖其他GUI元素
我有一个用Python、PyGTK 2.24和PyGST(GStreamer)做的项目。我的视频在gtk.DrawingArea对象里运行得很好。
不过,我需要在视频播放的时候,在它上面显示其他的界面元素。(请不要问为什么,反正就是需要。)现在,这些元素都显示在视频的后面。在代码里,视频对象(和gtk.DrawingArea)是先声明并放进gtk.Fixed的,然后才是其他的元素。
那么,我该怎么做呢?我需要改变GStreamer播放的对象吗?我知道这是可能的……我见过一些GStreamer程序,里面有按钮和标签是在视频上面的。
谢谢大家!
2 个回答
这可能对提问者没有什么帮助,但我花了很长时间寻找一种方法,想在gtk.gdk.Drawable元素(这可以是静态绘制的图像、动画或视频)上放置小部件,最后我终于在pygtk2中找到了实现方法。
这是我找到的解决方案链接:http://bazaar.launchpad.net/~damien-moore/picty/trunk/view/642/modules/picty/overlay_widgets.py
这个解决方案包含了三个自定义类:
ProportionalLayout:这是一个自定义的gtk.Container实现,允许用户根据比例来定位子小部件。
DrawableOverlay:这是一个EventBox,它会发出“绘制”事件,用户可以连接到这个事件并进行绘制,同时在上面显示一个ProportionalLayout。
DrawableOverlayHover:这是一个DrawableOverlayHover类,只有当鼠标指针“靠近”这些小部件时,它才会显示这些小部件。
示例main程序展示了如何使用这些类。代码应该相对简单,可以适应视频应用。
在GTK 3.2及以上版本中,你可以使用GtkOverlay
来实现这个功能。
如果你不能升级到新版本,那么这里有一种老办法的总结:你需要连接到DrawingArea
的expose-event
信号,然后用Cairo自己绘制信息。当信息发生变化时,使用widget.queue_draw()
来请求重新绘制绘图区域。确保你的处理程序在绘制实际视频的处理程序之后运行。这种方法适用于标签和非交互式的图形界面元素。
如果你想让一个真正可以操作的图形界面元素悬浮在视频上面,那就复杂多了,我不太清楚怎么做。我觉得Fixed
并不保证任何层级顺序。我怀疑你的按钮等元素可能被绘制在绘图区域上的视频覆盖了,所以也许在你的expose-event
处理程序中触发这些元素的重新绘制会有效。