pyqt5 setPixmap вылетает при попытке показать изображение в метке - PullRequest
1 голос
/ 22 апреля 2020

Я создал минимальный пример с конструктором 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_())

1 Ответ

3 голосов
/ 22 апреля 2020

«screenshot» разделяет ту же память с «qimg», а в качестве screenshot это локальная переменная, которая при удалении также удаляет связанную память, поэтому QPbelmap QLabel при попытке доступа к информации сгенерирует сегментацию неисправность . Решение состоит в том, чтобы сделать копию, чтобы они не разделяли одну и ту же память

def take_screenshot(self):
    screenshot = grab()
    qim = ImageQt(screenshot)<b>.copy()</b>
    pix = QtGui.QPixmap.fromImage(qim)
    self.label.setPixmap(pix)
    self.label.adjustSize()
...