2017-08-21 1 views
0

Je veux construire un lecteur vidéo avec Python, mais mon application aura plus de boutons que juste jouer/pause, donc j'ai besoin d'insérer la vidéo dans la fenêtre.Comment insérer un lecteur vidéo dans une fenêtre tkinter avec Python 3?

Je le code jusqu'à présent:

import tkinter 
import os 
import gi 
gi.require_version('Gst', '1.0') 
from gi.repository import GObject, Gst 


def set_frame_handle(bus, message, frame_id): 
    if not message.get_structure() is None: 
     if message.get_structure().get_name() == 'prepare-window-handle': 
      display_frame = message.src 
      display_frame.set_property('force-aspect-ratio', True) 
      display_frame.set_window_handle(frame_id) 

root = tkinter.Tk() 
w, h = root.winfo_screenwidth(), root.winfo_screenheight() 
root.geometry("%dx%d+0+0" % (w, h)) 

Gst.init(None) 
GObject.threads_init() 

video = tkinter.Frame(root, bg='#000000') 
video.grid(row=0, column=0, sticky="nsew") 

frame_id = video.winfo_id() 

player = Gst.ElementFactory.make('playbin', None) 
player.set_property('video-sink', None) 
player.set_property('uri', 'file://%s' % (os.path.abspath('out.mpeg'))) 
player.set_state(Gst.State.PLAYING) 

bus = player.get_bus() 
bus.add_signal_watch() 
bus.enable_sync_message_emission() 
bus.connect('sync-message::element', set_frame_handle, frame_id) 

root.mainloop() 

Mais cela ne crée 2 fenêtres, l'un d'eux est un moteur de rendu OpenGL ... J'ai besoin du lecteur vidéo dans la même fenêtre ...

+0

Vous avez actuellement un lecteur vidéo qui fonctionne? Si vous le faites alors tout ce que vous devez faire est d'ajouter plus de cadres ou placez vos autres boutons dans l'emplacement de la grille que vous voulez. Si vous avez besoin de placer quelque chose en haut ou à gauche de votre lecteur vidéo, vous devrez changer '.grid (row = 0, column = 0)' pour quelque chose qui n'est pas sur la première position de la grille. Probablement 'grille (rangée = 1, colonne = 1)'. Malheureusement, j'ai peu d'expérience avec l'intégration de vidéo, donc je ne peux pas aider beaucoup avec le problème de 2 fenêtres que vous rencontrez. Je ferais de l'imagerie il y a un moyen de l'intégrer dans un cadre. –

Répondre

-1

Je vous propose de créer un autre cadre à la place de la vidéo. Dans ce cadre supplémentaire vous emballer le magnétoscope et rien d'autre. Ensuite, vous pouvez créer autant de fenêtres que vous le souhaitez et vous référer à ce cadre supplémentaire. Cela facilitera l'organisation de tous vos autres boutons et de tout ce que vous voulez ajouter.

+0

Pouvez-vous me donner un exemple? Je ne suis pas sûr si j'ai compris votre suggestion ... Comment emballer le magnétoscope dans ce cadre supplémentaire? – Gabrielle

+0

Vous n'avez pas répondu à la question OPs et votre suggestion n'est pas vraiment bonne. Avec ou sans Frame, vous pouvez placer facilement des widgets dans des emplacements précis avec '.grid()', '.pack()' et '.place()'. Les cadres sont bons pour de nombreuses utilisations, mais dans ce cas, il n'est pas plus utile que de simplement les placer dans l'emplacement correct de la grille. –

+0

@SierraMountainTech savez-vous comment puis-je avoir au lieu de 2 fenêtres une seule avec le joueur à l'intérieur? Utilisant la grille ou place ou emballer ...? – Gabrielle