如何在Tkinter的Frame或Label组件中显示屏幕录制内容
Tkinter展示录屏画面的实现方案
你现有的摄像头显示逻辑本身是通用的,只要调整视频帧的来源就可以适配录屏场景,以下是两种常用场景的实现方案:
场景1:播放本地已有的录屏视频文件
只需要把cv2.VideoCapture的参数从摄像头ID0替换为你的录屏文件绝对/相对路径即可,同时补充帧读取异常判断避免视频播放结束后报错:
from tkinter import Tk, Frame, Label import cv2 from PIL import Image, ImageTk root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmain = Label(app) lmain.grid() # 替换为你的录屏文件路径,支持mp4/avi等常见视频格式 cap = cv2.VideoCapture("你的录屏文件路径.mp4") def video_stream(): ret, frame = cap.read() if not ret: # 可选配置:需要循环播放的话打开下一行注释,重置视频指针到开头 # cap.set(cv2.CAP_PROP_POS_FRAMES, 0) return cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) img = Image.fromarray(cv2image) imgtk = ImageTk.PhotoImage(image=img) lmain.imgtk = imgtk lmain.configure(image=imgtk) # 30ms刷新一次对应约30帧,可自行调整,不要用1ms的间隔,会占用过高CPU lmain.after(30, video_stream) root.after(30, video_stream) root.mainloop()
场景2:实时展示当前屏幕的录制画面
OpenCV本身不支持直接采集屏幕画面,需要借助屏幕捕捉库实现,以下是基于pyautogui的实现方案:
- 先安装依赖:
pip install pyautogui opencv-python pillow numpy - 替换原有代码为以下内容:
from tkinter import Tk, Frame, Label import cv2 import numpy as np from PIL import Image, ImageTk import pyautogui root = Tk() app = Frame(root, bg="white") app.grid() lmain = Label(app) lmain.grid() def video_stream(): # 采集当前屏幕画面 screen = pyautogui.screenshot() # 转换为OpenCV可处理的数组格式 frame = np.array(screen) cv2image = cv2.cvtColor(frame, cv2.COLOR_RGB2RGBA) img = Image.fromarray(cv2image) imgtk = ImageTk.PhotoImage(image=img) lmain.imgtk = imgtk lmain.configure(image=imgtk) lmain.after(30, video_stream) root.after(30, video_stream) root.mainloop()
注意事项
- 实时录屏场景如果觉得pyautogui性能不够,可以替换为
mss库实现更高帧率的屏幕捕捉 - 如果需要录制保存屏幕画面,可额外添加
cv2.VideoWriter逻辑把帧写入本地文件
内容的提问来源于stack exchange,提问作者Prajjwal
相关产品推荐
相关产品推荐

