alejandroautalan / pygubu

A simple GUI builder for the python tkinter module
MIT License
2.01k stars 213 forks source link

How to play video #232

Closed anasshakil closed 3 years ago

anasshakil commented 3 years ago

Hi i'm new to python. I want to play video from resources when i click on the button.

alejandroautalan commented 3 years ago

Hi Anas Shakil, thanks for trying pygubu.

You can try python-vlc Here is a simple example with pygubu (tested only on linux OS)

Let me knows if this helps. Regards Alejandro A.

File: vlcclientapp.py

import os
import sys
import tkinter as tk
import tkinter.ttk as ttk
import pygubu
import vlc

PROJECT_PATH = os.path.dirname(__file__)
PROJECT_UI = os.path.join(PROJECT_PATH, "vlcclient.ui")

_isMacOS   = sys.platform.startswith('darwin')
_isWindows = sys.platform.startswith('win')
_isLinux   = sys.platform.startswith('linux')

class VlcclientApp:

    def __init__(self):

        self.builder = builder = pygubu.Builder()
        builder.add_resource_path(PROJECT_PATH)
        builder.add_from_file(PROJECT_UI)
        self.mainwindow = builder.get_object('toplevel1')
        builder.connect_callbacks(self)

        self.videoframe = builder.get_object('videoframe')

        # VLC player
        self.is_playing = False
        args = []
        if _isLinux:
            args.append('--no-xlib')
        self.vlc_instance = vlc.Instance(args)
        self.vlc_player = self.vlc_instance.media_player_new()
        self.load_video()

        s = ttk.Style()
        s.configure('screen.TFrame', background='black')

    def load_video(self):
        VIDEO_FILE = '/home/alejandro/projects/videoplayer/video.mp4'
        m = self.vlc_instance.media_new(VIDEO_FILE)
        self.vlc_player.set_media(m)

        # set the window id where to render VLC's video output
        h = self.videoframe.winfo_id()  # .winfo_visualid()?
        if _isWindows:
            self.vlc_player.set_hwnd(h)
        elif _isLinux:
            self.vlc_player.set_xwindow(h)  # fails on Windows
        else:
            # FIXME: this should be made cross-platform
            # For mac support see: https://git.videolan.org/?p=vlc/bindings/python.git;a=blob;f=examples/tkvlc.py;h=9984138afa37132ad1279e55d66eb7b705e21b98;hb=HEAD
            pass

    def on_play_clicked(self):
        if not self.is_playing:
            self.vlc_player.play()
            self.is_playing = True

    def on_stop_clicked(self):
        if self.is_playing:
            self.is_playing = False
            self.vlc_player.pause()

    def run(self):
        self.mainwindow.mainloop()

if __name__ == '__main__':
    app = VlcclientApp()
    app.run()

File: vlcclient.ui

<?xml version='1.0' encoding='utf-8'?>
<interface version="1.1">
  <object class="tk.Toplevel" id="toplevel1">
    <property name="geometry">320x240</property>
    <property name="height">200</property>
    <property name="resizable">both</property>
    <property name="title" translatable="yes">VLC-Player</property>
    <property name="width">200</property>
    <child>
      <object class="ttk.Frame" id="frame1">
        <property name="height">200</property>
        <property name="padding">5</property>
        <property name="width">200</property>
        <layout manager="pack">
          <property name="expand">true</property>
          <property name="fill">both</property>
          <property name="propagate">True</property>
          <property name="side">top</property>
        </layout>
        <child>
          <object class="ttk.Frame" id="videoframe">
            <property name="height">200</property>
            <property name="style">screen.TFrame</property>
            <property name="width">200</property>
            <layout manager="pack">
              <property name="expand">true</property>
              <property name="fill">both</property>
              <property name="propagate">True</property>
              <property name="side">top</property>
            </layout>
          </object>
        </child>
        <child>
          <object class="ttk.Frame" id="buttons">
            <property name="height">200</property>
            <property name="width">200</property>
            <layout manager="pack">
              <property name="fill">x</property>
              <property name="propagate">True</property>
              <property name="side">top</property>
            </layout>
            <child>
              <object class="ttk.Button" id="button1">
                <property cbtype="simple" name="command" type="command">on_play_clicked</property>
                <property name="text" translatable="yes">Play</property>
                <layout manager="pack">
                  <property name="padx">0 5</property>
                  <property name="propagate">True</property>
                  <property name="side">left</property>
                </layout>
              </object>
            </child>
            <child>
              <object class="ttk.Button" id="button2">
                <property cbtype="simple" name="command" type="command">on_stop_clicked</property>
                <property name="text" translatable="yes">Stop</property>
                <layout manager="pack">
                  <property name="propagate">True</property>
                  <property name="side">left</property>
                </layout>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>
anasshakil commented 3 years ago

Thank you!