为什么捕获视频在 TKinter 循环中不刷新?



我希望视频捕获刷新屏幕。当它不是一个类时,它按我的预期工作。然后我把它转换为 oop -下面。 它没有刷新...然后我预计"之后"会完成这项工作。显然我不明白后如何工作?它不会连续调用 - 在我下面的情况下 - root.vidImg.vid(( 。如果是,为什么 self.cap = cv2。视频捕获(0( 不捕获并显示新图像? 提前感谢您的帮助

这是我的代码...

import tkinter as tk
from PIL import Image, ImageTk
import cv2

class Window(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.videoFrm = tk.Frame(self, width=480, bg='yellow', height=320)
self.videoFrm.grid(row=0, column=0, sticky=tk.NW)
self.vidImg = cnvs(self.videoFrm,self)
self.vidImg.grid()
class cnvs(tk.Frame):
def __init__(self,parent,controller):
tk.Frame.__init__(self,parent)
self.controller = controller
self.canvas = tk.Canvas(self, width=480, height=320, bg='green')
self.canvas.grid()
def vid(self):
# Capture video frames
self.cap = cv2.VideoCapture(0)
_, self.frame = self.cap.read()
self.img = cv2.flip(self.frame, 1)
self.cv2image = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGBA)
self.cv2image = cv2.resize(self.cv2image, (0, 0), fx=0.2, fy=0.2)
self.img = Image.fromarray(self.cv2image)
self.imgtk = ImageTk.PhotoImage(image=self.img)
self.canvas.create_image(10, 10, anchor=tk.NW, image=self.imgtk)
def main():
root = Window()
root.after(0, root.vidImg.vid())
root.mainloop()

if __name__ == '__main__':
main()

若要使用after方法创建动画循环,需要让动画函数多次调用自身。

在您的情况下,您可以将以下方法添加到cnvs类中:

def video_loop(self):
self.vid()
self.controller.after(10, self.video_loop)

然后在mainloop()之前调用它.

此外,与其为每一帧向画布添加新图像,不如使用canvas.itemconfig(...)更改现有图像。

最新更新