python-vlc不会将gtk小部件嵌入到窗口中,而是打开一个新窗口

时间:2019-05-08 16:38:13

标签: python gtk3 libvlc python-vlc

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

gtk3

我将其嵌入此处

import gi
import sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class PlayerWidget(Gtk.DrawingArea):

    __gtype_name__ = 'VLCWidget'

    def __init__(self, instance):

        Gtk.DrawingArea.__init__(self)
        self.player = instance.media_player_new()

        def handle_embed(*args):
            if sys.platform == 'win32':
                self.player.set_hwnd(self.get_window().get_handle())
            else:
                self.player.set_xwindow(self.get_window().get_xid())
            return True
        self.connect("realize", handle_embed)
        self.set_size_request(320, 200)

如果我将其嵌入到空的Gtk.window中,它将很好地工作。但是,如果我也向该窗口添加了一个import vlc import sys from widgets.player import PlayerWidget import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk class VideoPlayer(Gtk.Window): CONST_APP_NAME = "video player" def __init__(self): Gtk.Window.__init__(self) if 'linux' in sys.platform: self.instance = vlc.Instance("--no-xlib") else: self.instance = vlc.Instance() self.set_default_size(800, 600) header = Gtk.HeaderBar(title=self.CONST_APP_NAME) header.set_subtitle("Filename.mp4") header.set_show_close_button(True) # this one is the troublemaker self.set_titlebar(header) self.connect("destroy", Gtk.main_quit) self.player_widget = PlayerWidget(self.instance) self.add(self.player_widget) def show_window(self): self.show_all() Gtk.main() def set_media(self, fname): self.player_widget.player.set_media(self.instance.media_new(fname)) def play(self): self.player_widget.play() if not len(sys.argv) > 0: print('Please provide a filename') sys.exit(1) p = VideoPlayer() p.set_media(sys.argv[1]) p.play() p.show_window() p.instance.release() ,然后使用HeaderBar向该HeaderBar添加了一个关闭按钮,它将停止正常工作。 set_show_close_button(True)将不再显示为嵌入状态,而是会在播放视频的地方打开一个新的(第二个)窗口。如果我不向PlayerWidget添加关闭按钮,则该窗口小部件将被嵌入。

向控制台抛出警告:HeaderBar

我首先认为可能是因为我在Wayland下使用了gnome,但它同时出现在xcb_window window error: X server failureX上。

感谢您的帮助。

更新1:添加了完整的代码示例。当我今天运行它时,它第一次真正按预期运行,但之后又发生了与上述相同的错误。非常奇怪。

1 个答案:

答案 0 :(得分:0)

正如@mtz和@stovfl正确指出的那样,问题在于我在创建窗口(p.play())之前开始了视频播放(p.show_window())。

根据建议,我使用GLib.idle_add(p.play)让窗口一旦准备好就可以开始播放。可以使用from gi.repository import GLib导入GLib模块。