Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PythonVLC不会将gtk小部件嵌入窗口,而是打开一个新窗口_Python_Gtk3_Libvlc_Python Vlc - Fatal编程技术网

PythonVLC不会将gtk小部件嵌入窗口,而是打开一个新窗口

PythonVLC不会将gtk小部件嵌入窗口,而是打开一个新窗口,python,gtk3,libvlc,python-vlc,Python,Gtk3,Libvlc,Python Vlc,我正在为libvlc开发一个gtk3前端,该前端是使用python-vlc用python编写的。我正在遵循中的gtk3示例,但遇到了奇怪的行为。我有一个小部件,看起来像这样: 导入gi 导入系统 gi.require_版本('Gtk','3.0') 从gi.repository导入Gtk 职业球员禁区(Gtk.DrawingArea): __gtype_name_uuu='VLCWidget' 定义初始化(自身,实例): Gtk.图纸区域(自) self.player=instance.medi

我正在为
libvlc
开发一个
gtk3
前端,该前端是使用
python-vlc
用python编写的。我正在遵循中的
gtk3
示例,但遇到了奇怪的行为。我有一个小部件,看起来像这样:

导入gi
导入系统
gi.require_版本('Gtk','3.0')
从gi.repository导入Gtk
职业球员禁区(Gtk.DrawingArea):
__gtype_name_uuu='VLCWidget'
定义初始化(自身,实例):
Gtk.图纸区域(自)
self.player=instance.media\u player\u new()
def句柄_嵌入(*参数):
如果sys.platform==“win32”:
self.player.set\u hwnd(self.get\u window().get\u handle())
其他:
self.player.set_xwindow(self.get_window().get_xid())
返回真值
self.connect(“实现”,句柄\u嵌入)
自我设置大小请求(320200)
我将其嵌入此处:

导入vlc
导入系统
从widgets.player导入PlayerWidget
导入gi
gi.require_版本('Gtk','3.0')
从gi.repository导入Gtk
类视频播放器(Gtk.窗口):
CONST_APP_NAME=“视频播放器”
定义初始化(自):
Gtk.Window.\uuuu初始化\uuuuu(自)
如果sys.platform中的“linux”:
self.instance=vlc.instance(“--no-xlib”)
其他:
self.instance=vlc.instance()
设置默认大小(800600)
标题=Gtk.标题栏(标题=自身常量应用程序名称)
header.set_副标题(“Filename.mp4”)
header.set_show_close_按钮(True)#这个是麻烦制造者
自置标题栏(标题栏)
自我连接(“销毁”,Gtk.main_退出)
self.player\u widget=PlayerWidget(self.instance)
self.add(self.player\u小部件)
def显示窗口(自身):
self.show_all()
Gtk.main()
def set_介质(自身,fname):
self.player\u widget.player.set\u media(self.instance.media\u new(fname))
def播放(自我):
self.player\u widget.play()
如果不是len(sys.argv)>0:
打印('请提供文件名')
系统出口(1)
p=视频播放器()
p、 设置_媒体(sys.argv[1])
p、 play()
p、 显示窗口()
p、 instance.release()
如果我把它嵌入一个空的Gtk窗口,它就可以正常工作。但是,如果我也在该窗口中添加了一个
HeaderBar
,然后使用
set\u show\u close\u按钮(True)
向该
HeaderBar
添加一个close按钮,它将按预期停止工作。
PlayerWidget
将不再嵌入显示,而是打开一个新的(第二个)窗口来播放视频。如果我没有将关闭按钮添加到
标题栏
中,小部件将很好地嵌入

将向控制台抛出警告:
xcbu窗口错误:X服务器故障

我最初认为这可能是因为我在wayland下使用gnome,但它出现在
X
wayland

感谢您的帮助


更新1:添加了完整的代码示例。当我今天运行它的时候,第一次它确实像预期的那样工作,但是在那之后,上面描述的相同的错误再次出现。非常奇怪。

正如@mtz和@stovfl正确指出的,问题是我在创建窗口(
p.show_window()
)之前启动了视频播放(
p.play()


正如建议的那样,我使用了
GLib.idle\u add(p.play)
让窗口在准备好后开始播放。GLib模块可以使用gi中的
导入。存储库导入GLib

无法重现您的问题。尝试以下方法:做。将
p.play()
更改为
GLib.idle\u add(p.play)
以在开始播放之前显示
PlayerWidget
。在开始播放之前调用play-before-show窗口对我来说似乎很奇怪。如果您提供的窗口无效或未初始化,LibVLC将自己创建一个窗口。只有在确定所有内容都已正确初始化时才应调用Play。问题是在创建窗口之前运行p.Play。现在很有魅力,谢谢你们!我现在应该为我自己的问题创造一个答案吗?