在Tkinter主画布上打开cv2视频捕获画布并关闭i

2024-04-18 23:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大小为800x480的MainWindowgui和Python Tkinter。gui有一个create_image背景和两个create_window=button按钮。你知道吗

其中一个按钮启动Opencv4 CamStream画布,删除MainWindow画布。用户在视频上的任意位置单击鼠标1后,视频画布将被破坏,视频设备将被释放。你知道吗

我的问题是“回到”原来的画布。原始画布MainWindow在主程序中定义,并且CamStream被导入。当我试图在CamStream方法内调用MainWindow时,我得到一个错误,说MainWindow没有定义(因为我在导入的类方法内调用它?)。你知道吗

也许有更好的方法?我认为导入的代码仍然在主程序中运行,因此主程序类对它来说是已知的。你知道吗

简化的主程序:

import tkinter as tk
from PIL import Image, ImageTk
import numpy as np
import cv2
from videocapture import CamStream

root = tk.Tk()

class MainWindow:
    def __init__(self, window):
        self.window = window
        self.canvas = tk.Canvas(window, width=800, height=480)
        self.canvas.pack()

        camButton = tk.Button(window, text = 'camera', command = lambda: self.canvas.destroy() | CamStream(window))
        self.canvas.create_window(300,235, window=camButton, anchor = 'center')

MainWindow(root)
root.mainloop()

简化的导入videocapture代码:

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

class CamStream:
    def __init__(self, window):
        self.canvas = tk.Canvas(window, width=800, height=480)
        self.canvas.pack()

        # And other stuff

    def close_video(self, event):
        if MyVideoCapture().vid.isOpened:
            self.vid.vid.release()
            self.canvas.destroy()
            MainWindow(root)          #####Problem creating main canvas  ######

Tags: 方法fromimportself视频as画布create