为什么循环不在单独的线程中停止?

2024-10-03 02:32:50 发布

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

我正在尝试用tkinter和OpenCV构建一个简单的视频应用程序。我使用线程从相机捕获视频帧,将其转换为PIL图像,并将其设置为Tkinter标签中的图像。该应用程序的工作非常好,包括按钮,尽管当我试图关闭Tkinter窗口时会出现问题。我使用一个协议来做这件事,我将全局变量enablecam设置为false,这将停止循环和相机,但相反,它只是关闭Tkinter窗口,视频相机继续运行。我也尝试将变量记录到控制台,但一旦Tkinter窗口关闭,程序就会停止将输出记录到控制台。我不确定这是为什么或如何发生的,但我怀疑这可能与全局变量有关。我也尝试了root.quit()而不是root.destroy(),但这只会使窗口崩溃。 以下是申请的代码-

import tkinter as tk
import threading
import cv2
from PIL import Image, ImageTk
import time
from imutils.video import VideoStream

img = cv2.imread('img_avatar.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img2 = Image.fromarray(img)
enablecam = True
print(img2)

root = tk.Tk()

label = tk.Label(root, text="Video Camera Application")
label.grid(row=0, column=0)

img3 = ImageTk.PhotoImage(img2)

image = tk.Label(root, image=img3)
image.grid(row=1, column=0)


def capture_video():
    video = VideoStream().start()
    time.sleep(2)

    global img2, enablecam, image, img3, img

    while enablecam:
        frame = video.read()

        try:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            img2 = Image.fromarray(frame)

            img3 = ImageTk.PhotoImage(img2)
            image.configure(image=img3)
            image.image = img3
        except Exception as e:
            video.stop()
            break
    img2 = Image.fromarray(img)

    img3 = ImageTk.PhotoImage(img2)
    image.configure(image=img3)
    image.image = img3
    video.stop()


use_camera = threading.Thread(target=capture_video)
use_camera.start()


def handleCam():
    global use_camera, enablecam, img3, img2, image, img
    if enablecam:
        enablecam = False
        img2 = Image.fromarray(img)

        img3 = ImageTk.PhotoImage(img2)
        image.configure(image=img3)
        image.image = img3
    else:
        enablecam = True
        use_camera = threading.Thread(target=capture_video)
        use_camera.start()


cambtn = tk.Button(text='Enable Cam', command=handleCam)
cambtn.grid(row=2, column=0)


def on_closing():
    global enablecam, img3, img2, image, img, root

    if enablecam:
        enablecam = False
        img2 = Image.fromarray(img)

        img3 = ImageTk.PhotoImage(img2)
        image.configure(image=img3)
        image.image = img3

    root.destroy()


root.protocol("WM_DELETE_WINDOW", on_closing)

root.mainloop()

如果你能帮我解决这个问题,那就太好了,提前谢谢


Tags: imageimportimgusevideorootcv2tk