【问题标题】:Is there a way to take screenshot of a window in pyqt5 or qt5?有没有办法在 pyqt5 或 qt5 中截取窗口的屏幕截图?
【发布时间】:2018-12-23 23:49:05
【问题描述】:
#!/usr/bin/env python3
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QApplication, QWidget
import sys

app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
widget = QWidget()

screenshot = screen.grabWindow(0, 0, 0, 100, 100)
screenshot.save('shot', 'jpg')

我怎样才能用它来获得一个窗口?它只得到屏幕的一部分:

screenshot = screen.grabWindow( widget.winId() )

我需要一个跨平台方法..

【问题讨论】:

    标签: python pyqt qt5 pyqt5


    【解决方案1】:

    参考:http://doc.qt.io/qt-5/qscreen.html#grabWindow

    你说你需要一个窗口的截图,因此

    screenshot = screen.grabWindow(0, 0, 0, 100, 100)
    

    在这里不合适,因为它会捕获整个屏幕,根据最后 4 个参数进行裁剪。 (这100个参数是宽度和高度)。

    screenshot = screen.grabWindow( widget.winId() )
    

    捕获小部件窗口。但是,您可能无法在此调用中获得预期结果的原因是您没有创建实体小部件和/或小部件未显示。请尝试以下示例,确保应用在您的主显示屏上,然后再单击按钮。

    from PyQt5 import QtWidgets
    import sys
    
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QWidget()
    
    grab_btn=QtWidgets.QPushButton('Grab Screen')
    def click_handler():
        screen = QtWidgets.QApplication.primaryScreen()
        screenshot = screen.grabWindow( w.winId() )
        screenshot.save('shot.jpg', 'jpg')
        w.close()
    
    grab_btn.clicked.connect(click_handler)
    
    layout = QtWidgets.QVBoxLayout()
    layout.addWidget(grab_btn)
    w.setLayout(layout)
    w.show()
    
    sys.exit(app.exec_())
    

    我已经在 Windows 上对此进行了测试。

    【讨论】:

    • 我尝试了 widget.winId() 但它没有获得程序(窗口)它获得相同的主屏幕但裁剪(我在 linux 上)
    • 您使用的确切代码是什么。您是否在没有 int 参数的情况下调用 screenshot = screen.grabWindow(widget.winId() )?
    • 我认为问题可能在于 QWidget() 不是一个实体窗口。让我检查一下……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多