from tkinter import filedialog
from PIL import Image, ImageTk
import pygame
from moviepy.editor import VideoFileClip
import cv2
import moviepy
class AnimateGifLabel(Label):
def __init__(self, *argv, image = None, **kwargs):
self.master = argv[0]
self.filename = image
self.check_cadrs()
self.i = 0
self.img = Image.open(image)
self.img.seek(0)
self.image = ImageTk.PhotoImage(self.img)
super().__init__(*argv, image = self.image, **kwargs)
if 'delay' in kwargs:
self.delay = kwargs['delay']
else:
try:
self.delay = self.img.info['duration']
except:
self.delay = 100
#self.delay = 3 # Это минимально возможная задержка - иначе ткинтер не успевает обновится и не обновляет 2 (Но реагирует на события типа изменнения размера ) а при 1 даже не появляется
self.after(self.delay, self.show_new_cadr)
def check_cadrs(self):
self.cadrs = Image.open(self.filename).n_frames
def show_new_cadr(self):
if self.i == self.cadrs:
self.i=0
self.img.seek(self.i)
self.image = ImageTk.PhotoImage(self.img)
self.config(image = self.image)
self.i+=1
self.master.after(self.delay, self.show_new_cadr)
class VideoLabel(Label):
def __init__(self, *argv, video = None, **kwargs):
self.master = argv[0]
self.filename = video
self.video = cv2.VideoCapture(self.filename)
cap = VideoFileClip(self.filename)
audio = cap.audio
audio.write_audiofile('$-python-tk-video-frame-audio.wav')
pygame.init()
self.sound = pygame.mixer.Sound('$-python-tk-video-frame-audio.wav')
#clip = VideoFileClip(self.filename)
#clip.write_gif("$~python-tk-video-label.gif")
#self.filename = "$~python-tk-video-label.gif"
flag, frame = self.video.read()
self.image = self.tk_image(frame)
super().__init__(*argv, image = self.image, text = '0 sec', compound = 'top', **kwargs)
self.sound.play()
self.after(35, self.show_new_cadr)
self.i=1
def tk_image(self, cvframe):
cv2.imwrite("$-python-tk-video-frame.jpg", cvframe)
img = Image.open("$-python-tk-video-frame.jpg")
return ImageTk.PhotoImage(img)
def show_new_cadr(self):
self.i+=1
flag, frame = self.video.read()
if flag == False:
self.i = 0
self.video.set(0, 0)
self.image = self.tk_image(frame)
self.config(image = self.image, text = str(self.i//24) + ' sec')
self.master.after(35, self.show_new_cadr)
root = Tk()
root.title('31.gif')
root['bg'] = 'white'
AnimateGifLabel(root, image = filedialog.askopenfilename(filetypes = (('GIF Animation Image', '*.gif'),('All files', '*.*')))).pack()
clipka = VideoLabel(root, video = filedialog.askopenfilename(filetypes=(('MP4 Video', '*.mp4'),('All files', '*.*'))))
clipka.pack( expand =1 , fill = 'both')
root.mainloop()