2010-05-17 1 views
26

Я создаю модуль отчетности бета-тестеров, чтобы они могли отправлять свои комментарии на мое программное обеспечение, но я хотел бы иметь возможность включить скриншот с отчетом. Как сделать снимок экрана с помощью Python в Windows? Я нашел несколько примеров в Linux, но не имел большой удачи в Windows.Получить скриншот на Windows с Python?

+1

Это один работал для меня: HTTP: // StackOverflow. com/questions/4589206/python-windows-7-screenshot-without-pil – User

ответ

19

Стоит отметить, что ImageGrab работает только на MSWindows.

Для совместимости с кросс-платформой человек может быть лучше использовать библиотеку wxPython. http://wiki.wxpython.org/WorkingWithImages#A_Flexible_Screen_Capture_App

import wx 
wx.App() # Need to create an App instance before doing anything 
screen = wx.ScreenDC() 
size = screen.GetSize() 
bmp = wx.EmptyBitmap(size[0], size[1]) 
mem = wx.MemoryDC(bmp) 
mem.Blit(0, 0, size[0], size[1], screen, 0, 0) 
del mem # Release bitmap 
bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG) 
+0

AttributeError: объект 'module' не имеет атрибута 'App' –

+3

app = wx.App() в противном случае вы можете получить: wx._core.PyNoAppError: Сначала нужно создать объект wx.App! Кроме того, скачайте wxPython здесь: http://wxpython.org/download.php По какой-то причине это не то же самое «wx», если вы просто делаете «pip install wx» –

+0

Окно CLI выходит пустым – olekb

3

Простой способ сделать скриншот через Pygame.

pygame.image.save(Surface, filename) 

Где Поверхность 'является поверхность вы принимаете скриншот, и «имя файла» является путь к файлу, имя и тип, где вы сохраните таял изображение.

Вы можете экспортировать BMP, TGA, PNG или JPEG. С Pygame 1.8, PNG и JPEG также работают.

Если имя файла не указано, оно будет по умолчанию использовать .TGA-файл.

Вы также можете использовать библиотеку «os» для сохранения в определенных файловых каталогах.

Пример:

import os 
import pygame 
surface = pygame.display.set_mode((100, 100), 0, 32) 
surface.fill((255, 255, 255)) 
pygame.draw.circle(surface, (0, 0, 0), (10, 10), 15, 0) 
pygame.display.update() 
pygame.image.save(surface, os.path.expanduser("~/Desktop/pic.png")) 

Это экономит что-нибудь на «поверхности» поверхности на рабочем столе пользователя, как pic.png

+0

Два вопроса: 1. Независимо от платформы pygame? 2. Можете ли вы получить скриншот с несколькими мониторами? –

+1

Насколько я знаю, Pygame - платформа независимая. Этот код будет только снижать экран pygame и только экран pygame.Если ваш экран охватывает два монитора, я думаю, что он сможет (хотя я не могу это проверить). Надеюсь это поможет! – CPSuperstore

0

Вы можете использовать модуль ImageGrab. ImageGrab работает только в Windows, и вам нужно PIL (Pillow), чтобы использовать его. Вот небольшой пример:

import ImageGrab 
snapshot = ImageGrab.grab() 
save_path = "C:\\Users\\YourUser\\Desktop\\MySnapshot.jpg" 
snapshot.save(save_path) 
6

Другой подход, который действительно быстро является MSS модуль. Он отличается от других решений тем, что использует только стандартный модуль ctypes, поэтому он не требует больших зависимостей. Это OS независим и его использование легко:

from mss import mss 

with mss() as sct: 
    sct.shot() 

И просто найти файл, содержащий screenshot.png снимок экрана первого монитора. Есть много possibile настроек, вы можете играть с ScreenShot объектами и OpenCV/Numpy/PIL/и т.д ..

+1

см. Больше примеров в https://python-mss.readthedocs.io/en/dev/examples.html – tal

+0

@tal: Ваша ссылка устарела. Не могли бы вы обновить? –

+0

@ Tiger-222: Как бы вы получили несколько мониторов? –

0

Для пользователей pyautogui:

import pyautogui 
screenshot = pyautogui.screenshot()