python - Højreklik på Windows, med VLC og PyGTK

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg sender en videoapplikation fra Linux til Windows, og jeg bruger VLC som media backend. Jeg fik et lille problem, som jeg ikke kunne finde endnu en løsning: Programmet reagerer ikke, når jeg højreklikker over videobillede, mens filmen spiller. Ligesom GTK ikke modtager højreklikket på grund af VLC. Det ser ud til at være et vout-driverproblem, fordi jeg testede med MPlayer og højreklikk fungerede, indtil jeg brugte direct3d eller gl som video driver. Hvad kunne løsningen være her? Jeg bruger VLC med VLC Python bindinger på Windows 7.

Bedste reference


Jeg havde et lignende problem.
Du skal bare videregive False til libvlc\_video\_set\_key\_input og libvlc\_video\_set\_mouse\_input funktioner.


Eksempel på arbejdskode:


instance = vlc.Instance()

class VLCWidget(gtk.DrawingArea):
    def \_\_init\_\_(self, *p):
        gtk.DrawingArea.\_\_init\_\_(self)
        self.player = instance.media\_player\_new()
        def handle\_embed(*args):
            self.player.set\_hwnd(self.window.handle)
            return True
        self.connect("map", handle\_embed)
        self.set\_size\_request(320, 200)

class Player(gtk.Window):
    def \_\_init\_\_(self):
        gtk.Window.\_\_init\_\_(self)

        vbox = gtk.VBox()
        self.\_vlc\_widget = VLCWidget()
        self.player = self.\_vlc\_widget.player
        self.player.video\_set\_mouse\_input(False)
        self.player.video\_set\_key\_input(False)
        vbox.pack\_start(self.\_vlc\_widget, expand=True)
        self.\_toolbar = self.get\_player\_control\_toolbar()
        self.pack\_start(self.\_toolbar, expand=False)
        self.add(vbox)

        self.\_vlc\_widget.set\_events(
            gtk.gdk.BUTTON\_PRESS\_MASK
        )
        self.\_vlc\_widget.connect("button-press-event", self.on\_vlc\_button\_press)

    def on\_vlc\_button\_press(self, widget, event):
        print "pressed"

    def get\_player\_control\_toolbar(self):
        tb = gtk.Toolbar()
        tb.set\_style(gtk.TOOLBAR\_ICONS)
        for tooltip, stock, callback in (
            (\_("Play"), gtk.STOCK\_MEDIA\_PLAY, lambda b: self.player.play()),
            (\_("Pause"), gtk.STOCK\_MEDIA\_PAUSE, lambda b: self.player.pause()),
            (\_("Stop"), gtk.STOCK\_MEDIA\_STOP, lambda b: self.player.stop()),
            ):
            b=gtk.ToolButton(stock)
            b.set\_tooltip\_text(tooltip)
            b.connect("clicked", callback)
            tb.insert(b, -1)
        tb.show\_all()
        return tb

    def main(self, fname):
        self.show\_all()
        self.player.set\_media(instance.media\_new(fname))
        self.connect("destroy", gtk.main\_quit)
        gtk.main()

if \_\_name\_\_ == '\_\_main\_\_':
    p=Player()
    p.main("path\_to\_file")