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!
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. –
Danke für den Hinweis! – Sam