使用Python截取窗口屏幕截图

8

我将尝试使用 Python 脚本在 Linux 上截取当前窗口的屏幕截图。

目前我已经有一个可以截取整个屏幕的脚本:

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

但我只想要选定的窗口。我知道问题来自grabWindow,但我不知道如何解决。

4个回答

9

简单地替换

QApplication.desktop()

使用你想要截屏的小部件。
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_()

7
自Qt5开始,grabWindowgrabWidget已经过时(请参见QPixmap的过时成员)。
相反,您可以使用QWidget.grab()
p=widget.grab()

如果在MainWindow中有一个滚动区域,那么这种方法就不起作用了。它只会打印窗口的顶部部分。 - Chris P

0

或者,而不是

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

你也可以使用

p = QPixmap.grabWidget(widget)

0

PyQt5 更新

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

这将保存整个屏幕而不是单个窗口。 - Ratbert
这是PyQt5的更新,将桌面替换为您想要抓取的小部件,如上面的答案所指示。 - Most Wanted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接