我正在尝试用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()
如果你能帮我解决这个问题,那就太好了,提前谢谢
这是因为while循环没有得到任何命令
enablecam = False
。保持这个循环,我认为它应该起作用相关问题 更多 >
编程相关推荐