2017-08-02 28 views
0

我期待視頻捕捉刷新屏幕。當它不是一個班,它按我的預期工作。然後我將它轉換爲oop -below。 它沒有刷新......然後我預計「之後」會做這項工作。顯然,我不明白如何工作後?它不會在下面調用 - root.vidImg.vid()。如果是,爲什麼self.cap = cv2.VideoCapture(0)不捕獲並顯示新圖像? 感謝提前爲什麼捕捉視頻不會在tkinter循環中刷新?

這裏是我的代碼來幫助...

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() 

回答

0

要創建一個animation loop with the after method,你需要讓動畫函數調用本身多次。

在你的情況,你可以在下面的方法添加到cnvs類:

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

,然後就在mainloop()之前調用它。

此外,不是在每個畫面上爲畫布添加新圖像,而是使用canvas.itemconfig(...)來更好地使用change the existing image

+1

謝謝你的兩條建議;運作良好 –

+0

@Ekmel,不客氣!請[接受答案](https://meta.stackexchange.com/a/5235/361431)表明您的問題已解決;) – Josselin