使用OpenCV、Tkinter实现按钮关闭摄像头功能的问题咨询
实现摄像头关闭功能的修改方案
核心修改逻辑如下:
- 新增全局状态变量控制帧刷新循环的运行状态
- 修正原有
show_frame函数中重复创建Label的问题 - 新增关闭摄像头的处理函数,绑定到关闭按钮
- 优化打开逻辑,避免重复触发打开操作的异常
完整修改后代码
import cv2 import numpy as np from time import sleep from tkinter import * from PIL import Image from PIL import ImageTk white = "#ffffff" lightBlue2 = "#adc5ed" font = "Constantia" WIDTH = 1920 HEIGHT = 1080 fontButtons = (font, 12) maxWidth = 1000 maxHeight = 600 mainWindow = Tk() mainWindow.title('RocketShip') mainWindow.configure(width = WIDTH, height = HEIGHT, bg="black") mainFrame = Frame(mainWindow, height = 640, width = 810) mainFrame.place(x=350,y=0) cameraFrame = Frame(mainWindow, height = 640, width = 405) cameraFrame.place(x = 0, y = 0) lmain = Label(mainFrame) cap = cv2.VideoCapture(0) # 新增摄像头运行状态标记 camera_active = False def open_camera(): global camera_active, cap # 避免重复触发开启逻辑 if camera_active: return # 若摄像头已被释放则重新初始化捕获对象 if not cap.isOpened(): cap = cv2.VideoCapture(0) camera_active = True show_frame() def show_frame(): global camera_active # 状态为关闭时终止帧刷新循环 if not camera_active: return ret, frame = cap.read() if not ret: return cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = Image.fromarray(cv2image).resize((810,640)) imgtk = ImageTk.PhotoImage(image=img) lmain.grid(row=0, column=0) lmain.imgtk = imgtk lmain.configure(image=imgtk) lmain.after(10, show_frame) def close_camera(): global camera_active, cap # 关闭帧刷新开关 camera_active = False # 释放摄像头硬件资源 cap.release() # 清空显示区域的画面 lmain.configure(image='') lmain.imgtk = None #Buttons TurnCameraOn = Button(cameraFrame, width = 405, height = 25, bg = "blue", command = open_camera) TurnCameraOn.place(x = 0, y = 0) TurnCameraOff = Button(cameraFrame, width = 405, height = 25, bg = "blue", command=close_camera) TurnCameraOff.place(x = 0, y = 300) #file menu menubar = Menu(mainWindow) file = Menu(menubar, tearoff = 0) menubar.add_cascade(label ='Commands', menu = file) file.add_command(label ='Open Camera', command = open_camera) file.add_separator() file.add_command(label ='Exit', command = lambda:mainWindow.destroy()) mainWindow.config(menu = menubar) mainWindow.mainloop()
关键改动说明
- 新增
camera_active全局变量作为帧刷新循环的开关,值为False时会自动终止show_frame的递归调度 - 新增
open_camera函数统一处理摄像头开启逻辑,避免重复触发开启操作导致的异常 - 新增
close_camera函数,依次执行关闭帧刷新开关、释放摄像头硬件资源、清空显示画面的操作 - 移除了
show_frame函数内部重复创建lmain控件的代码,避免冗余控件导致的内存占用持续升高问题 - 给关闭按钮
TurnCameraOff绑定了close_camera回调,同步修改了菜单栏「打开摄像头」选项的绑定函数为open_camera
内容的提问来源于stack exchange,提问作者PandaMan456_
相关产品推荐
相关产品推荐

