You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中是否有与JavaScript的requestAnimationFrame()等效的函数?

在Python中实现类似requestAnimationFrame的屏幕捕获逻辑

JavaScript的window.requestAnimationFrame()会和浏览器屏幕刷新同步调度回调,避免无效执行。在Python中,你可以通过以下两种方案实现类似逻辑,替代高CPU占用的while True循环:

方案1:使用Tkinter(无需额外安装)

Tkinter是Python自带的GUI库,其after()方法可以模拟递归式的帧调度,近似对齐屏幕刷新率:

import tkinter as tk
from PIL import ImageGrab

# 初始化Tkinter并隐藏窗口
root = tk.Tk()
root.withdraw()

def check_screen():
    # 捕获当前屏幕
    screen_img = ImageGrab.grab()
    # 检查目标像素
    if screen_img.getpixel((0, 0)) == (1, 2, 3):
        print("Pixel (0, 0) is rgb(1, 2, 3)")
    # 递归调度下一次检查,间隔16ms(对应60FPS,可根据屏幕刷新率调整)
    root.after(16, check_screen)

# 启动调度循环
check_screen()
root.mainloop()

说明:此方案无需额外依赖,但固定间隔可能无法完全匹配屏幕实际刷新率(如144Hz显示器需调整为7ms左右)。

方案2:使用Pygame(精准对齐屏幕刷新率)

Pygame能与系统垂直同步(VSync)对齐,精准匹配屏幕刷新率,CPU占用更低:

首先安装依赖:

pip install pygame

实现代码:

import pygame
from PIL import ImageGrab

# 初始化Pygame,创建隐藏窗口用于获取VSync信号
pygame.init()
pygame.display.set_mode((1, 1), pygame.HIDDEN)
clock = pygame.time.Clock()

def check_screen():
    # 捕获当前屏幕
    screen_img = ImageGrab.grab()
    # 检查目标像素
    if screen_img.getpixel((0, 0)) == (1, 2, 3):
        print("Pixel (0, 0) is rgb(1, 2, 3)")
    # 处理Pygame事件,避免程序假死
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            return
    # 对齐屏幕刷新率(自动匹配显示器FPS,无需手动设置)
    clock.tick_busy_loop(0)
    pygame.display.flip()
    # 递归调度下一次检查
    check_screen()

# 启动调度循环
check_screen()

说明:clock.tick_busy_loop(0)会让循环严格跟随系统VSync信号,完全匹配屏幕刷新率,避免无效的屏幕捕获操作。

内容的提问来源于stack exchange,提问作者Rojo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:30:39