2016-07-28 10 views
1

Ich verwende eine Webcam-Ansicht und führe eine Analyse der aufgenommenen Bilder durch. Ich möchte eine Funktion vorstellen, mit der ein Fenster aufgerufen werden kann und der Benutzer die Webcam-Ansicht in einem neuen Fenster betrachten kann , sollten sie es wünschen. Mein Versuch führt jedoch dazu, dass Schaltflächen in meinem Hauptfenster zu der Instanz wechseln, wenn ich das neue Fenster öffne. Was läuft falsch?Tkinter Webcam-Ansicht im zweiten Fenster anzeigen

Hier ist mein (Arbeits-) Beispiel:

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

class CamView(): 
    def __init__(self, parent): 
     self.parent = parent 
     self.window = tk.Toplevel(parent) 

     self.window.protocol("WM_DELETE_WINDOW", self.close) 
     self.show_frame() 

    def show_frame(self): 
     imgtk = ImageTk.PhotoImage(image=self.parent.img) 
     lmain.imgtk = imgtk 
     lmain.configure(image=imgtk) 

    def close(self): 
     self.parent.test_frame = None 
     self.window.destroy() 

root = tk.Tk() 
root.bind('<Escape>', lambda e: root.quit()) 
lmain = tk.Label(root) 
lmain.pack() 

class Main(tk.Frame): 
    def __init__(self, parent): 
     self.test_frame = None 
     frame = tk.Frame.__init__(self,parent) 
     a = tk.Label(text='hello!').pack() 
     b = tk.Button(frame, text='open', command=self.load_window) 
     b.pack() 

     width, height = 800, 600 
     self.cap = cv2.VideoCapture(0) 
     self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) 
     self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) 

     self.do_stuff() 

    def do_stuff(self): 
     _, frame = self.cap.read() 
     frame = cv2.flip(frame, 1) 
     cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 
     self.img = Image.fromarray(cv2image) 

     if self.test_frame != None: 
      self.test_frame.show_frame() 
     lmain.after(10, self.do_stuff) 

    def load_window(self): 
     self.test_frame = CamView(self) 

control = Main(root) 
root.mainloop() 

In meinem realen Code sowie das Arbeitsbeispiel - es scheint, dass, wenn ich das neue Fenster zu laden, es den Webcam Rahmen im ersten Fenster platziert wenn ich es nicht will!

+0

Ich habe keine Kamera oder cv2, also kann ich Ihren Code nicht ausführen oder viel Hilfe bei diesem mysteriösen Problem anbieten, leider. Sie sollten jedoch 'CamView' zu einer neuen Stilklasse machen, indem Sie' class CamView (object): 'verwenden. Diese Änderung wird sich wahrscheinlich nicht auf Ihr Problem auswirken, aber es ist selten eine gute Idee, alte Klassen zu verwenden. Außerdem wird "self.test_frame is None" gegenüber "self.test_frame! = None" bevorzugt. –

+0

Danke für den Hinweis! – Sam

Antwort

1

Behoben! Ich wurde wegen self.lmain verwirrt. Hier ist der Arbeitscode:

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

class CamView(): 
    def __init__(self, parent): 
     self.parent = parent 
     self.window = tk.Toplevel(parent) 

     self.lmain2 = tk.Label(self.window) 
     self.lmain2.pack() 

     self.window.protocol("WM_DELETE_WINDOW", self.close) 
     self.show_frame() 

    def show_frame(self): 
     imgtk = ImageTk.PhotoImage(image=self.parent.img) 
     self.lmain2.imgtk = imgtk 
     self.lmain2.configure(image=imgtk) 

    def close(self): 
     self.parent.test_frame = None 
     self.window.destroy() 

root = tk.Tk() 
root.bind('<Escape>', lambda e: root.quit()) 

class Main(tk.Frame): 
    def __init__(self, parent): 

     self.lmain = tk.Label(parent) 
     self.lmain.pack() 

     self.test_frame = None 
     frame = tk.Frame.__init__(self,parent) 
     a = tk.Label(text='hello!').pack() 
     b = tk.Button(frame, text='open', command=self.load_window) 
     b.pack() 

     width, height = 800, 600 
     self.cap = cv2.VideoCapture(0) 
     self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) 
     self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) 

     self.do_stuff() 

    def do_stuff(self): 
     _, frame = self.cap.read() 
     frame = cv2.flip(frame, 1) 
     cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 
     self.img = Image.fromarray(cv2image) 
     if self.test_frame != None: 
      self.test_frame.show_frame() 
     self.lmain.after(10, self.do_stuff) 

    def load_window(self): 
     if self.test_frame == None: 
      self.test_frame = CamView(self) 

control = Main(root) 
root.mainloop() 
Verwandte Themen