[我用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_())
“屏幕快照”与“ 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()