2010-05-17 10 views
26

Tworzę moduł raportowania Beta Testerów, dzięki czemu mogą przesłać swoje komentarze do mojego oprogramowania, ale chciałbym mieć możliwość dołączenia zrzutu ekranu do raportu. Jak zrobić zrzut ekranu z Pythonem w systemie Windows? Znalazłem kilka przykładów na Linuksie, ale nie miałem dużo szczęścia w systemie Windows.Zyskaj zrzut ekranu na Windowsie z Pythonem?

+1

Ten pracował dla mnie: http: // stackoverflow. com/questions/4589206/python-windows-7-screenshot-without-pil – User

Odpowiedz

19

Warto zauważyć, że ImageGrab działa tylko na MSWindows.

Aby uzyskać zgodność z różnymi platformami, najlepiej wykorzystać daną bibliotekę 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: obiekt 'module' nie ma atrybutu 'App' –

+3

app = wx.App() w przeciwnym razie możesz uzyskać: wx._core.PyNoAppError: The Obiekt wx.App musi zostać utworzony jako pierwszy! Pobierz również wxPython stąd: http://wxpython.org/download.php Z jakiegoś powodu nie jest to ten sam "wx", jeśli po prostu robisz "pip install wx" –

+0

Okna CLI wychodzące puste – olekb

3

w prosty sposób zrobić zrzut ekranu jest przez Pygame.

pygame.image.save(Surface, filename) 

Gdzie Surface "to powierzchnia wszystkich przyjmowanych zrzut ekranu i„filename”to ścieżka, nazwa, typ i gdzie można zaoszczędzić Thew obrazu.

Można eksportować jako pliki BMP, TGA, PNG lub JPEG. Począwszy od wersji Pygame 1.8, PNG i JPEG również działają.

Jeśli nie zostanie określone rozszerzenie pliku, będzie domyślnie plik .TGA.

Można nawet użyć biblioteki "os" do zapisania w określonych katalogach plików.

Przykład:

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")) 

Oszczędza to wszystko na 'powierzchni' Surface na pulpicie użytkownika jako pic.png

+0

Dwa pytania: 1. Czy platforma pygame jest niezależna? 2. Czy możesz uzyskać zrzut ekranu z wieloma monitorami? –

+1

O ile mi wiadomo, Pygame jest platformą niezależną. Ten kod spowoduje zeskanowanie tylko ekranu pygame i tylko ekranu pygame.Jeśli twój ekran obejmuje dwa monitory, sądzę, że byłby w stanie (chociaż nie jestem w stanie tego przetestować). Mam nadzieję że to pomoże! – CPSuperstore

0

można użyć modułu ImageGrab. ImageGrab działa tylko w systemie Windows i potrzebujesz PIL (Poduszka), aby go użyć. Oto mały przykład:

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

Innym podejściem, które jest bardzo szybki jest moduł MSS. Różni się od innych rozwiązań tym, że używa tylko standardowego modułu ctypes, więc nie wymaga dużych zależności. Jest to niezależny system operacyjny i jego zastosowanie jest proste:

from mss import mss 

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

I tylko znaleźć plik screenshot.png zawierający zrzut ekranu z pierwszego monitora. Istnieje wiele possibile dostosowań, można grać z ScreenShot obiektów i OpenCV/NumPy/PIL/etc ..

+1

zobacz więcej przykładów w https://python-mss.readthedocs.io/en/dev/examples.html – tal

+0

@tal: Twój link jest nieaktualny. Czy mógłbyś zaktualizować? –

+0

@ Tiger-222: Jak otrzymasz wiele monitorów? –

0

Dla użytkowników pyautogui:

import pyautogui 
screenshot = pyautogui.screenshot()