gpt4 book ai didi

python - DrawingArea 无法获取 XID

转载 作者:行者123 更新时间:2023-11-28 20:27:39 27 4
gpt4 key购买 nike

我有以下 Python 2.7/PyGObject 3.0/PyGST 0.10 模块:

from gi.repository import Gtk, Gdk, GdkPixbuf
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()
print "Run before"
Gdk.Display.get_default().sync()
print "Run after"
win_id = videowidget.window.xid
imagesink = message.src
imagesink.set_property("force-aspect-ratio", True)
imagesink.set_xwindow_id(win_id)
Gtk.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)

fixed = Gtk.Fixed()
win.add(fixed)
fixed.show()

videowidget = Gtk.DrawingArea()
fixed.put(videowidget, 0, 0)
videowidget.set_size_request(640, 480)
videowidget.show()

# 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)

win.show()

def main():
Gdk.threads_enter()
Gtk.main()
return 0

if __name__ == "__main__":
Video()
main()

我总是遇到此错误,视频会在新窗口中打开,而不是在现有窗口中打开。

Traceback (most recent call last): File "video.py", line 32, in on_sync_message win_id = videowidget.window.xid AttributeError: 'DrawingArea' object has no attribute 'window'

如何解决这个问题,让视频显示在我创建的窗口中,而不是新窗口中?

顺便说一下,这个问题是在我从 PyGTK 2.24 切换到 PyGObject 3.0 之后才开始出现的。

最佳答案

(转载自 GNOME PyGObject 3 Bug Report 663360。答案归功于 Timo Vanwynsberghe)。

有几点需要注意: - 必须先实现绘图区,然后才能获得它的 GdkWindow - 显然,您不能直接获取 window 属性 - 您需要为 xid 方法导入 GdkX11

考虑到这一点,这是一个最小的工作示例:

from gi.repository import GdkX11, Gtk

class App:
def __init__(self):
win = Gtk.Window()
win.resize(400, 400)
win.connect('delete-event', Gtk.main_quit)

da = Gtk.DrawingArea()
win.add(da)
win.show_all()

print da.get_property('window').get_xid()

if __name__ == "__main__":
App()
Gtk.main()

关于python - DrawingArea 无法获取 XID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com