Holen Sie sich das Fenster-Handle in PyGI

In meinem Programm verwende ich PyGObject / PyGI und GStreamer, um ein Video in meiner GUI anzuzeigen. Das Video wird in einem @ angezeiGtk.DrawingArea und deshalb brauche ich das Fensterhandle imrealize -signal-handler. Unter Linux bekomme ich dieses Handle mit:

drawing_area.get_property('window').get_xid()

Aber wie bekomme ich Windows in den Griff?

Ich habe im Internet gesucht, aber nur Beispiele für PyGtk mit @ gefundewindow.handle was mit PyGI nicht funktioniert.

Die GStreamer-Dokumentation enthält einBeispie welches das @ benutGDK_WINDOW_HWND Makro, um das Handle zu bekommen. Dieses Makro verwendet AFAIKgdk_win32_drawable_get_handle. Aber wie geht das in Python mit PyGI?

Update 15-07-28: Code hinzugefügt (vereinfacht)
Ich bekomme immer noch keine Videowiedergabe für Windows.
Problem 1: Ich kann das Fensterhandle in _on_video_realize () nicht abrufen.
Problem 2: Die Methode _on_player_sync_message () wird nie aufgerufen.

class MultimediaPlayer:
    def __init__(self):
        # ... some init stuff ...

        self._drawing_area.connect('realize', self._on_video_realize)
        self._drawing_area.connect('unrealize', self._on_video_unrealize)

        # GStreamer setup
        # ---------------
        self._player = Gst.ElementFactory.make('playbin', 'MultimediaPlayer')
        bus = self._player.get_bus()
        bus.add_signal_watch()
        bus.connect('message', self._on_player_message)
        bus.enable_sync_message_emission()
        bus.connect('sync-message::element', self._on_player_sync_message)

    def _on_video_realize(self, widget):
        print('----------> _on_video_realize')
        # The xid must be retrieved first in GUI-thread and before
        # playing pipeline.
        if sys.platform == "win32":
            self._drawing_area.get_property('window').ensure_native()
            # -------------------------------------------------------------
            # TODO [PROBLEM 1] How to get handle here?
            #                  self._drawing_area.GetHandle() does not exist!
            # -------------------------------------------------------------
        else:
            self._wnd_hnd = (self._drawing_area.get_property('window')
                                                                    .get_xid())

    def _on_video_unrealize(self, widget):
        self._player.set_state(Gst.State.NULL)

    def _on_player_message(self, bus, message):
        # ... handle some messages here ...

    def _on_player_sync_message(self, bus, message):
        # ---------------------------------------------------------------------
        # TODO [PROBLEM 2] This method is never called on Windows after opening
        #                  a video_file! But on Linux it is!
        # ---------------------------------------------------------------------

        print('----------> _on_player_sync_message')
        if message.get_structure() is None:
            return True
        if message.get_structure().get_name() == "prepare-window-handle":
            imagesink = message.src
            imagesink.set_property("force-aspect-ratio", True)
            imagesink.set_window_handle(self._wnd_hnd)

    def play(self):
        self._player.set_state(Gst.State.PLAYING)

    def stop(self):
        self._player.set_state(Gst.State.NULL)

    def set_file(self, file):
        # ... 
        self._player.set_property('uri', "file:///" + file)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage