首页 > 解决方案 > 当我使用枕头模块截取一张截图时,我该怎么办?

问题描述

每次按下键盘上的“p”键时,我都会尝试使用 Python 拍摄几张屏幕截图,并且每个新屏幕截图都会更新页码。但是,程序最终会在每次按下该键时截取多个屏幕截图。

    from PIL import ImageGrab
    import keyboard

    def shot(number):
        while True:
            if keyboard.is_pressed('p'):
                 image = ImageGrab.grab(bbox=(580, 0, 1340, 1080))
                 image.save(f"{number} page.pdf")
                 shot(number + 1)
            else:
                 pass

    for i in range(1, 2):
            shot(i)

标签: pythonrecursionpython-imaging-libraryscreenshot

解决方案


问题是您使用的递归,您在屏幕后立即调用它,试试这个:

from PIL import ImageGrab
import keyboard
import time

def shot(number):
        while True:
            if keyboard.is_pressed('p'):
                 image = ImageGrab.grab(bbox=(580, 0, 1340, 1080))
                 image.save(f"{number} page.pdf")
                 break
            else:
                 pass

i=1
while True:
    shot(i)
    #suspend for a second, so we don't take another screen immediately 
    time.sleep(1)
    i+=1

但是有一种更简单的方法,如果使用 ,则不需要使用循环keyboard.wait,这也更有效。

同样为了避免内存消耗,我们可以通过一个简单的循环来摆脱递归:

from PIL import ImageGrab
import keyboard
import time

def shot(number):
    keyboard.wait("p")
    image = ImageGrab.grab(bbox=(580, 0, 1340, 1080))
    image.save(f"{number} page.pdf")
    time.sleep(1)

i=1
while True:
    shot(i)
    i+=1

推荐阅读