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("<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的视频方面,如果有错望指正。

  • 13
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python中使用Tkinter播放视频可以使用OpenCV库来实现。首先,你需要获取视频文件的路径,可以使用filedialog.askopenfilename()函数来打开文件选择对话框并选择视频文件。然后,通过cv2.VideoCapture()函数来获取视频对象以及视频的帧率。接下来,你需要使用循环来读取视频的每一帧并在Tkinter界面上显示出来。你可以使用cv2.VideoCapture.read()函数来读取视频的帧,然后使用cv2.cvtColor()函数将帧转换为RGBA格式并使用Image.fromarray()函数将其转换为Image对象。最后,将Image对象转换为ImageTk.PhotoImage对象,并使用Label的config()方法将其显示在Tkinter界面上。如果你想实现视频的循环播放,可以使用root.after()函数来控制视频播放速度并循环调用video_loop()函数。 另外,如果你想实现视频播放暂停功能,你可以使用bind()函数将按钮的事件与对应的函数绑定起来。例如,你可以使用Button的bind()方法将按钮的鼠标释放事件与start()和stop()函数绑定起来。在start()函数中,你可以将flag设置为1,以便在video_loop()中继续播放视频。而在stop()函数中,你可以将flag设置为0,以便在video_loop()中暂停视频播放。 综上所述,在Python Tkinter播放视频可以通过OpenCV库来实现。你需要获取视频文件的路径,然后使用cv2.VideoCapture()函数来获取视频对象和帧率。之后,你可以使用循环来读取视频的每一帧并在Tkinter界面上显示出来。如果需要循环播放视频,可以使用root.after()函数来控制视频播放速度并循环调用video_loop()函数。如果需要实现播放暂停功能,可以使用bind()函数将按钮的事件与对应的函数绑定起来,并在相应的函数中设置flag的值来控制视频播放状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python tkinter界面实现本地视频播放暂停](https://blog.csdn.net/weixin_38860623/article/details/104632146)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值