title: Flickering video in opencv-tkinter integration
body: <p>I am trying to build a GUI using tkinter in python 3.6.4 64-bit on Windows 8 by integrating opencv components into the program. I can get the video to play, but there is significant flicker going on. Namely, a screen the same color as the native tkinter background shows up briefly several times a second. I've tested several cameras with similar results, and double-checked that the cameras work properly via native video playback software. Here is my code:</p>
  
  <pre><code>from tkinter import *
  from PIL import Image, ImageTk
  import cv2
  import threading
  
  cap = cv2.VideoCapture(0)
  
  root = Tk()
  def videoLoop():
      global root
      global cap
      vidLabel = None
      while True:
          ret, frame = cap.read()
          frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
          frame = Image.fromarray(frame)
          frame = ImageTk.PhotoImage(frame)
          if vidLabel: vidLabel.configure(image=frame)
          else:
              vidLabel = Label(root, image=frame, anchor=NW)
              vidLabel.pack(expand=YES, fill=BOTH)
  
  videoThread = threading.Thread(target=videoLoop, args=())
  videoThread.start()
  root.mainloop()
  </code></pre>
  
  <p>Could anyone suggest what I might be doing wrong? I did hear that tkinter doesn't always play well with threads, but that's about all I can think of. In response to a comment suggesting the flicker is caused by label updating, I added some code that still reads from video and updates the label within the loop, but uses an image loaded outside of the loop to update the label. The flicker then goes away, although (to my understanding) the efficiency of the loop and updating of the label hasn't changed. Here is the changed videoLoop function (with flicker gone):
      def videoLoop():
          global root
          vidLabel = None
          cap = cv2.VideoCapture(0)</p>
  
  <pre><code>    ret, frame = cap.read()
      frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
      frame = Image.fromarray(frame)
      frame = ImageTk.PhotoImage(frame)
  
      while True:
          ret, lame = cap.read()
          lame = cv2.cvtColor(lame, cv2.COLOR_BGR2RGB)
          lame = Image.fromarray(lame)
          lame = ImageTk.PhotoImage(lame)
  
          if vidLabel:
              vidLabel.configure(image=None)
              vidLabel.configure(image=frame)
          else:
              vidLabel = Label(root, image=frame, anchor=NW)
              vidLabel.pack(expand=YES, fill=BOTH)
  </code></pre>