调整大小时,GtkDrawingArea变得混乱

时间:2019-05-18 10:09:27

标签: python python-3.x gtk3 pygtk python-vlc

我正在使用GTK+libvlcpython的{​​{1}}的{​​{1}}前端工作。到目前为止,我遵循的是this guide,它工作正常,除了在调整窗口大小时,python-vlc变得混乱,正如您在图片中看到的那样(我可能不知道这种现象的含义,不知道)。


Messed up GtkDrawingArea


我在控制台中收到这些警告,但是不确定是否与此有关:

DrawingArea

我已经尝试使用[00007fce1c014eb0] main filter error: Failed to create video converter [00007fce2807ff70] vdpau_avcodec generic error: Xlib is required for VDPAU 的{​​{1}}样式设置窗口的背景颜色,但是没有效果。

我认为这不应该发生,我缺少什么吗?顺便说一下,我正在css上。

2 个答案:

答案 0 :(得分:1)

使用Google并检查不同的示例,我创建了用黑色填充DrawingArea背景的代码。

将绘图功能分配给DrawingArea

self.draw_area = Gtk.DrawingArea()
self.draw_area.connect("draw", self.da_draw_event)

填充区域的功能

def da_draw_event(self, widget, cairo_ctx):
    cairo_ctx.set_source_rgb(0, 0, 0)
    cairo_ctx.paint()

完整代码

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

import vlc

MRL = ""

class ApplicationWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Python-Vlc Media Player")
        self.player_paused=False
        self.is_player_active = False
        self.connect("destroy", Gtk.main_quit)

    def show(self):
        self.show_all()

    def setup_objects_and_events(self):
        self.playback_button = Gtk.Button()
        self.stop_button = Gtk.Button()

        self.play_image = Gtk.Image.new_from_icon_name(
                "gtk-media-play",
                Gtk.IconSize.MENU
            )
        self.pause_image = Gtk.Image.new_from_icon_name(
                "gtk-media-pause",
                Gtk.IconSize.MENU
            )
        self.stop_image = Gtk.Image.new_from_icon_name(
                "gtk-media-stop",
                Gtk.IconSize.MENU
            )

        self.playback_button.set_image(self.play_image)
        self.stop_button.set_image(self.stop_image)

        self.playback_button.connect("clicked", self.toggle_player_playback)
        self.stop_button.connect("clicked", self.stop_player)

        self.draw_area = Gtk.DrawingArea()
        self.draw_area.set_size_request(300, 300)
        self.draw_area.connect("realize",self._realized)
        self.draw_area.connect("draw", self.da_draw_event)

        self.hbox = Gtk.Box(spacing=6)
        self.hbox.pack_start(self.playback_button, True, True, 0)
        self.hbox.pack_start(self.stop_button, True, True, 0)

        self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.add(self.vbox)
        self.vbox.pack_start(self.draw_area, True, True, 0)
        self.vbox.pack_start(self.hbox, False, False, 0)

    def da_draw_event(self, widget, cairo_ctx):
        #print('da_draw_event')
        #print('widget:', widget)
        #print('cairo_ctx:', cairo_ctx)

        cairo_ctx.set_source_rgb(0, 0, 0)
        cairo_ctx.paint()

    def stop_player(self, widget, data=None):
        self.player.stop()
        self.is_player_active = False
        self.playback_button.set_image(self.play_image)

    def toggle_player_playback(self, widget, data=None):

        """
        Handler for Player's Playback Button (Play/Pause).
        """

        if self.is_player_active == False and self.player_paused == False:
            self.player.play()
            self.playback_button.set_image(self.pause_image)
            self.is_player_active = True

        elif self.is_player_active == True and self.player_paused == True:
            self.player.play()
            self.playback_button.set_image(self.pause_image)
            self.player_paused = False

        elif self.is_player_active == True and self.player_paused == False:
            self.player.pause()
            self.playback_button.set_image(self.play_image)
            self.player_paused = True
        else:
            pass

    def _realized(self, widget, data=None):
        self.vlcInstance = vlc.Instance("--no-xlib")
        self.player = self.vlcInstance.media_player_new()
        win_id = widget.get_window().get_xid()
        self.player.set_xwindow(win_id)
        self.player.set_mrl(MRL)
        self.player.play()
        self.playback_button.set_image(self.pause_image)
        self.is_player_active = True

if __name__ == '__main__':
    if not sys.argv[1:]:
       print("Exiting \nMust provide the MRL.")
       sys.exit(1)
    if len(sys.argv[1:]) == 1:
        MRL = sys.argv[1]
        window = ApplicationWindow()
        window.setup_objects_and_events()
        window.show()
        Gtk.main()
        window.player.stop()
        window.vlcInstance.release()

答案 1 :(得分:0)

正如@furas在评论中指出的那样,不断在DrawingArea上绘制黑色矩形效果很好。我在widget派生的Gtk.DrawingArea中使用以下代码:

def draw(self, c, *args):
    rect = self.get_allocation()
    win = self.get_window().get_position()
    c.set_source_rgb(0, 0, 0)
    c.rectangle(rect.x - win.x, rect.y - win.y, rect.width, rect.height)
    c.fill()
self.connect("draw", draw)

编辑:有关更简单的方法,请参见@furas答案。