pyqt5 setPixmap尝试在标签中显示图像时崩溃

问题描述 投票:0回答:1

[我用pyqt设计器创建了一个最小的示例,该示例在按下按钮时更改了标签的文本,并且应该通过标签在窗口中显示屏幕截图。

[不幸的是,该示例仅在尝试在标签中显示屏幕截图时崩溃。任何出现问题的建议都将受到高度赞赏。

from PIL.ImageQt import ImageQt
from PyQt5 import QtCore, QtGui, QtWidgets
from pyscreenshot import grab

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(503, 382)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(70, 30, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(80, 100, 47, 14))
        self.label.setObjectName("label")

        self.retranslateUi(Form)
        self.pushButton.clicked.connect(lambda: self.take_screenshot())
        QtCore.QMetaObject.connectSlotsByName(Form)

    def take_screenshot(self):
        self.label.setText("1?")
        screenshot = grab()
        self.label.setText("2")
        qim = ImageQt(screenshot)
        pix = QtGui.QPixmap.fromImage(qim)
        self.label.setText("3")
        self.label.setPixmap(pix)



    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.pushButton.setText(_translate("Form", "PushButton"))
        self.label.setText(_translate("Form", "TextLabel"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
python pyqt pyqt5 screenshot qpixmap
1个回答
2
投票

“屏幕快照”与“ qimg”共享相同的内存,并且作为屏幕快照,它是一个局部变量,当消除了关联的内存时,它也被消除,因此QLabel的QPbelmap在尝试访问信息时将生成Segmentation fault] >。解决方案是制作一个副本,以使它们不共享相同的内存

def take_screenshot(self):
    screenshot = grab()
    qim = ImageQt(screenshot).copy()
    pix = QtGui.QPixmap.fromImage(qim)
    self.label.setPixmap(pix)
    self.label.adjustSize()
© www.soinside.com 2019 - 2024. All rights reserved.