Captura de pantalla de una ventana usando python

Estoy tratando de tomar una captura de pantalla de la ventana actual usando un script de Python en Linux.

Actualmente tengo un script que toma una captura de pantalla de toda la pantalla:

import sys
from PyQt4.QtGui import QPixmap, QApplication
from datetime import datetime

date = datetime.now()
filename = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
app = QApplication(sys.argv)
QPixmap.grabWindow(QApplication.desktop().winId()).save(filename, 'jpg')

Pero a me gustaría tener solo la ventana seleccionada. Sé que el problema proviene de grabWindow. Pero no se como solucionarlo.

preguntado el 22 de mayo de 12 a las 17:05

4 Respuestas

simplemente reemplace

QApplication.desktop()

con el widget del que desea tomar la captura de pantalla.

import sys
from PyQt4.QtGui import *
from datetime import datetime

date = datetime.now()
filename = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
app = QApplication(sys.argv)
widget = QWidget()
# set up the QWidget...
widget.setLayout(QVBoxLayout())

label = QLabel()
widget.layout().addWidget(label)

def shoot():
    p = QPixmap.grabWindow(widget.winId())
    p.save(filename, 'jpg')
    label.setPixmap(p)        # just for fun :)
    print "shot taken"

widget.layout().addWidget(QPushButton('take screenshot', clicked=shoot))

widget.show()
app.exec_()

contestado el 22 de mayo de 12 a las 17:05

Desde Qt5, grabWindow y grabWidget están obsoletos (ver Miembros obsoletos para QPixmap)

En su lugar, puede utilizar QWidget.grab()

p=widget.grab()

Respondido 12 Oct 15, 09:10

Eso no funciona en caso de que tenga un área de desplazamiento dentro de MainWindow. Solo imprime la parte superior de la ventana. - Chris P

Alternativamente, en lugar de

p = QPixmap.grabWindow(widget.winId())

también puedes usar

p = QPixmap.grabWidget(widget)

Respondido 06 ago 14, 11:08

PyQt5 actualización

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtGui import QPixmap, QScreen
from datetime import datetime

date = datetime.now()
filename = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
app = QApplication(sys.argv)
QScreen.grabWindow(app.primaryScreen(), 
QApplication.desktop().winId()).save(filename, 'png')

Respondido 01 Feb 20, 19:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.