PIL.ImageGrab有很多替代品.
如果您想要跨平台,几乎每个主要的窗口库都有屏幕抓取功能.这是使用PyQt4的示例:
import sys
from PyQt4.QtGui import QPixmap, QApplication
app = QApplication(sys.argv)
QPixmap.grabWindow(QApplication.desktop().winId()).save('screenshot.jpg', 'jpg')
如果您想要与Qt认为“桌面”的默认设置不同的东西,您需要深入了解PyQt或Qt文档.
缺点是这些跨平台窗口库在安装,分发方面通常都很重要,有时甚至是你如何构建程序.
另一种方法是使用特定于Windows的代码.虽然可以直接使用Windows API,但更简单的解决方案是PyWin32.
import win32gui, win32ui, win32con, win32api
hwin = win32gui.GetDesktopWindow()
width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
hwindc = win32gui.GetWindowDC(hwin)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, width, height)
memdc.SelectObject(bmp)
memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
bmp.SaveBitmapFile(memdc, 'screenshot.bmp')
像往常一样,你必须准确指出“桌面”的含义;此版本指定当前会话的“虚拟屏幕”,如果您在控制台本地运行,则为所有监视器的组合,如果您在终端服务上运行,则为远程视图.如果您想要不同的东西,您必须阅读MSDN上的相关Win32文档.但在大多数情况下,从文档转换到PyWin32是微不足道的.
(顺便说一句,即使我说“Win32”,同样适用于Win64.)