PyQt5, при выборе изображения вылетает ошибка 'память не может быть read'
Перешел с tkinter на PyQt5, и в качестве практики хочу создать простой редактор изображений, также используя PIL. Пока что в программе есть только Label и кнопка которая вызывает диалог выбора файла, и при выборе файла, из 7 изображений только одно отображается в Label, в других же случаях вот такая ошибка: http://mmolabel.ru/wp-content/uploads/2018/03/pamyat-ne-mozhet-byt-read.jpg
Вот код виджетов
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(70, 40, 651, 391))
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(644, 560, 131, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Здесь будет фото"))
self.pushButton.setText(_translate("MainWindow", "Выберите изображение"))
Вот файл с логикой, запускать необходимо его, и из той же директории что и первый
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
from pr_visual import Ui_MainWindow
import sys
from PIL import Image
from PIL.ImageQt import ImageQt
def opendialog():
dialog = QFileDialog()
fname = dialog.getOpenFileName(None, 'Open file', '/')[0]
img = Image.open(fname)
width = img.size[0]
height = img.size[1]
qimg = ImageQt(img)
width = img.size[0]
height = img.size[1]
pixmap = QtGui.QPixmap.fromImage(qimg)
ui.label.setGeometry(QtCore.QRect(0, 0, width, height))
ui.label.setPixmap(pixmap)
#Create main window
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)
window.setWindowTitle('PR')
window.show()
#Logic
ui.pushButton.clicked.connect( opendialog )
#mainloop
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Вам не нужны никакие дополнительные библиотеки.
Я предложу вам:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog
#from PIL import Image
#from PIL.ImageQt import ImageQt
#from pr_visual import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(70, 40, 651, 391))
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(644, 560, 131, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Здесь будет фото"))
self.pushButton.setText(_translate("MainWindow", "Выберите изображение"))
def opendialog():
dialog = QFileDialog()
fname = dialog.getOpenFileName(None, 'Open file', '/')[0]
if fname:
pixmap = QtGui.QPixmap(fname).scaled(
ui.label.size(),
QtCore.Qt.KeepAspectRatio)
ui.label.setPixmap(pixmap)
ui.label.setAlignment(QtCore.Qt.AlignCenter)
#Create main window
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(window)
window.setWindowTitle('PR')
window.show()
#Logic
ui.pushButton.clicked.connect( opendialog )
#mainloop
sys.exit(app.exec_())
