Video Player By Python Tkinter, When I Pause Video, I Cannot Re-play
Solution 1:
Question: Pause button will have no effect.
Reference:
Tkinter.Widget.after-method -
after(delay_ms, callback=None, *args)Registers an callback that is called after a given time.
Tkinter.Widget.after_cancel-method -
after_cancel(id)Cancels an callback.
To cancel the allready queued events for self.play_video change the following:
defplay_video(self):
...
if self.pause:
self.window.after_cancel(self.after_id)
else:
self.after_id = self.window.after(self.delay, self.play_video)
Solution 2:
I would create another method for the play button callback. Something like this:
defplay_start(self):
self.pause = False
self.play_video()
However, I would make sure you disable the play button if it's already playing. Otherwise, you could have multiple "instances" of play_video going if the play button is pressed multiple times.
An alternative is to combine your play and pause button, so it toggles the value of self.pause. Then you could have just one button with one callback function.
Solution 3:
Simply add in the play_video(self) method:
ifself.pause == True:
self.pause = FalsereturnSolution 4:
if not self.pause:
self.window.after(self.delay, self.play_video)
else:
self.pause = FalseSolution 5:
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
import PIL.Image, PIL.ImageTk
import cv2
classvideoGUI:
def__init__(self, window, window_title):
self.window = window
self.window.title(window_title)
top_frame = Frame(self.window)
top_frame.pack(side=TOP, pady=5)
bottom_frame = Frame(self.window)
bottom_frame.pack(side=BOTTOM, pady=5)
self.pause = False# Parameter that controls pause button
self.canvas = Canvas(top_frame)
self.canvas.pack()
# Select Button
self.btn_select=Button(bottom_frame, text="Select video file", width=15, command=self.open_file)
self.btn_select.grid(row=0, column=0)
# Play Button
self.btn_play=Button(bottom_frame, text="Play", width=15, command=self.play_video)
self.btn_play.grid(row=0, column=1)
# Pause Button
self.btn_pause=Button(bottom_frame, text="Pause", width=15, command=self.pause_video)
self.btn_pause.grid(row=0, column=2)
# Resume Button
self.btn_resume=Button(bottom_frame, text="resume", width=15, command=self.resume_video)
self.btn_resume.grid(row=0, column=3)
self.delay = 15# ms
self.window.mainloop()
defopen_file(self):
self.pause = False
self.filename = filedialog.askopenfilename(title="Select file", filetypes=(("MP4 files", "*.mp4"),
("WMV files", "*.wmv"), ("AVI files", "*.avi")))
print(self.filename)
# Open the video file
self.cap = cv2.VideoCapture(self.filename)
self.width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
self.height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
self.canvas.config(width = self.width, height = self.height)
defget_frame(self): # get only one frametry:
if self.cap.isOpened():
ret, frame = self.cap.read()
return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
except:
messagebox.showerror(title='Video file not found', message='Please select a video file.')
defplay_video(self):
# Get a frame from the video source, and go to the next frame automatically
ret, frame = self.get_frame()
if ret:
self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
self.canvas.create_image(0, 0, image = self.photo, anchor = NW)
ifnot self.pause:
self.window.after(self.delay, self.play_video)
defpause_video(self):
self.pause = True#Additiondefresume_video(self):
self.pause=False
self.play_video()
# Release the video source when the object is destroyeddef__del__(self):
if self.cap.isOpened():
self.cap.release()
##### End Class ###### Create a window and pass it to videoGUI Class
videoGUI(Tk(), "EnJapan")
Post a Comment for "Video Player By Python Tkinter, When I Pause Video, I Cannot Re-play"