实现功能:
学习资源:【[Pyqt]给python添加一个可视化界面(二)-哔哩哔哩】https://b23.tv/U7fSNq1
使用python将图片展示在界面的label中:
增加了label作为显示图像的控件
python功能代码添加了打开文件选择对话框的程序,实现点击按钮在对话框中可选择用来显示的图像文件
加入了针对qt的label控件显示图像的转换函数
报错1:NameError: name ‘QFileDialog‘ is not defined
错误原因:QFileDialog是在QtWidgets module
解决方法:需要在QFileDialog前加上QtWidgets
#选择且获取图片文件地址
def writeline(self):
fileName, filetype = QtWidgets.QFileDialog.getOpenFileName(
None,
"选取文件",
"C:/",
"Image Files (*.bmp *.jpg *.jpeg *.png)")
self.showFile(fileName)
报错2:NameError: name 'cv2' is not defined
解决方法:按照学习记录Day1中总结的,下载cv2模块
(9条消息) 学习记录Day1-Python GUI设计PyQt5从入门到实践_li_s_t的博客-CSDN博客
报错3:No matching distribution found for cv2
错误原因:安装的时候包名不是cv2
解决方法:修改安装命令↓↓↓
pip install opencv_python -i https://pypi.douban.com/simple
报错4:NameError: name 'cv2' is not defined
报错5:NameError: name ‘numpy’ is not defined
报错原因:确认两个模块都已经下载成功后,仍然报错~可能是使用了cv2/numpy模块中的函数,但没有导入cv2/numpy
解决方法:在调用的函数前,导入模块cv2/numpy
import sys,cv2,numpy
from PyQt5 import QtCore, QtGui, QtWidgets
报错6:ERROR: No matching distribution found for numpy
报错原因:在安装numpy时,出现报错~说是位于这个镜像上的库不受信任或不安全的主机,将被忽略
解决方法:需要让它受信任,所以将修改代码↓↓↓
pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
报错7:no matching distribution found for QImage
报错8:NameError: name 'QPixmap' is not defined
报错原因:使用了QImage/QPixmap模块中的函数,但没有导入QImage/QPixmap
解决方法:在调用的函数前,导入模块QImage/QPixmap
import sys,cv2,numpy
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QImage,QPixmap
打开文件界面展示
附完整代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'file.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import sys,cv2,numpy
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QImage,QPixmap
class Ui_File(object):
def setupUi(self, File):
File.setObjectName("File")
File.resize(1000, 700)
File.setMaximumSize(QtCore.QSize(1000, 700))
self.centralwidget = QtWidgets.QWidget(File)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(210, 40, 751, 571))
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(60, 120, 75, 23))
self.pushButton.setObjectName("pushButton")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(210, 40, 751, 571))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.frame.raise_()
self.label.raise_()
self.pushButton.raise_()
File.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(File)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 22))
self.menubar.setObjectName("menubar")
File.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(File)
self.statusbar.setObjectName("statusbar")
File.setStatusBar(self.statusbar)
self.retranslateUi(File)
QtCore.QMetaObject.connectSlotsByName(File)
def retranslateUi(self, File):
_translate = QtCore.QCoreApplication.translate
File.setWindowTitle(_translate("File", "MainWindow"))
self.label.setText(_translate("File", "TextLabel"))
self.pushButton.setText(_translate("File", "打开文件"))
self.pushButton.clicked.connect(self.writeline)
#选择且获取图片文件地址
def writeline(self):
fileName, filetype = QtWidgets.QFileDialog.getOpenFileName(
None,
"选取文件",
"C:/",
"Image Files (*.bmp *.jpg *.jpeg *.png)")
self.showFile(fileName)
# 将图片显示在label
def showFile(self, fileName):
srcImage = cv2.imdecode(numpy.fromfile(fileName, dtype=numpy.uint8), -1)
image_height, image_width, image_depth = srcImage.shape # 获取图像的高,宽以及深度。
# opencv读图片是BGR,qt显示要RGB,所以需要转换一下
QImg = cv2.cvtColor(srcImage, cv2.COLOR_BGR2RGB)
QShowImage = QImage(QImg.data, image_width, image_height, # 创建QImage格式的图像,并读入图像信息
image_width * image_depth,
QImage.Format_RGB888)
self.label.clear()
QShowImage = QShowImage.scaled(
self.label.width(),
self.label.height()) # 图片适应label大小
self.label.setPixmap(QPixmap.fromImage(QShowImage))
# 主方法
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
ui = Ui_File() # 创建PyQt5设计的窗体对象
ui.setupUi(MainWindow) # 调用PyQt5窗体的方法对窗体对象进行初始化设置
MainWindow.show() # 显示窗体
sys.exit(app.exec_()) # 程序关闭时退出进程