Python tkinter界面下实现本地视频的播放与暂停
在Python上是小白,前几天遇到视频的操作问题,查了网上许多资料都没有,今天终于把它弄出来了,有点激动,记录下了免得自己忘了。
如题目所示,是想实现在tkinter界面下的视频操作,一开始的代码如下:
# 视频显示
def video_loop(self, movieLabel):
movie_path = filedialog.askopenfilename() # 打开文件路径
cap = cv2.VideoCapture(movie_path) # 获取视频
wait_time = 1000 / self.cap.get(5) # 视频频率
ret, frame = cap.read() # 读取照片
# print('读取成功')
while (cap.isOpened()):
if ret:
img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
current_image = Image.fromarray(img).resize((540, 320)) # 将图像转换成Image对象
imgtk = ImageTk.PhotoImage(image=current_image)
self.movieLabel.imgtk = imgtk
self.movieLabel.config(image=imgtk)
self.movieLabel.update()
cv2.waitKey(int(wait_time))
这样能在tkinter界面上进行视频播放,但是却无法视频播放和暂停的按钮,网上所提到的waitKey(0)只能在类似imshow之后的highGUI界面中才能起效果。所以我换了一种.afer的视频显示方法。
使用bind关联按钮事件:
#按钮
start_button = Button(self.page2, text='开始', width=5)
start_button.place(x=10, y=330)
start_button.bind("<ButtonRelease-1>", self.start)
stop_button = Button(self.page2, text='暂停', width=5)
stop_button.place(x=70, y=330)
stop_button.bind("<ButtonRelease-1>", self.stop)
self.video_get(self.movieLabel)
# 按钮的关联事件
def start(self,event):
self.flag = 1
self.video_loop(self.cap)
def stop(self,event):
self.flag = 0
通过root.after()函数可以实现视频的循环播放。
# 获取视频
def video_get(self, movieLabel):
movie_path = filedialog.askopenfilename() # 打开文件路径
self.cap = cv2.VideoCapture(movie_path) # 获取视频
self.wait_time = 1000 / self.cap.get(5) # 视频频率
self.video_loop(self.cap)
#视频播放
def video_loop(self,cap):
ret, frame = cap.read() # 读取照片
if ret:
img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
current_image = Image.fromarray(img).resize((540, 320)) # 将图像转换成Image对象
imgtk = ImageTk.PhotoImage(image=current_image)
self.movieLabel.imgtk = imgtk
self.movieLabel.config(image=imgtk)
# self.movieLabel.update()
if self.flag == 1:
self.page2.after(int(self.wait_time), lambda: self.video_loop(cap)) # 通过after实现视频循环播放
如此就能实现点击“暂停”按钮就暂停视频播放,点击“开始”按钮就开始播放视频。
刚刚接触tpython的视频方面,如果有错望指正。