Python tkinter界面下实现本地视频的播放与暂停

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("", self.start)

stop_button = Button(self.page2, text='暂停', width=5)
stop_button.place(x=70, y=330)
stop_button.bind("", 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的视频方面,如果有错望指正。

你可能感兴趣的:(python,python)