首先是python中配置PYQT,可以参照以下
PYQT5安装以及 PYQT integration 在vscode中的配置-CSDN博客
这里最难的就是找到pyqt的安装路径,找到路径跟着改就行。
使用qt设计师进行简单的界面设计
![](https://img-blog.csdnimg.cn/direct/f03940041ba74b5b951d5614898e4e6f.png)
进入设计界面
![](https://img-blog.csdnimg.cn/direct/8cddac39c56c45be8785bebeb776c1ec.png)
pyqt简单的设计参照
转化ui为py⽂件
![](https://img-blog.csdnimg.cn/direct/4d0a6a0cfb8a4152ab5659f44f8c31a4.png)
用python实现
代码实现的过程要注意设计的各个控件的名称要与写的代码相匹配
from PyQt5.QtWidgets import (QApplication,QLabel,QDialog,QPushButton,QMainWindow,QFileDialog)
import sys
from Ui_test4 import Ui_MainWindow
import rasterio as rio
from rasterio.plot import show
from matplotlib.backends.backend_qtagg import (
FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure
import numpy as np
import tifffile
class mclass(Ui_MainWindow,QMainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.static_canvas = FigureCanvas(Figure(figsize=(5, 3)))
# Ideally one would use self.addToolBar here, but it is slightly
# incompatible between PyQt6 and other bindings, so we just add the
# toolbar as a plain widget instead.
# self.horizontalLayout.addWidget(NavigationToolbar(static_canvas, self))
# self.horizontalLayout.addWidget(self.canvas)
# self.horizontalLayout()
self.show()
self.pushButtonOpen.clicked.connect(self.openfile)
self.pushButtonNDVI.clicked.connect(self.clNDVI)
self.pushButtonout.clicked.connect(self.clExport)
self.filename1=""
def openfile(self):
# 打开文件对话框
options = QFileDialog.Options()
options = QFileDialog.ReadOnly
file_name, _ = QFileDialog.getOpenFileName(self, '打开文件', '', 'All Files (*);;Text Files (*.txt)', options=options)
# fd = QtWidgets.QFileDialog()
# fd.setFileMode(QtWidgets.QFileDialog.FileMode.ExistingFiles)
# fd.exec()
# self.file_name = ''.join(fd.selectedFiles())
if file_name:
# 在这里处理文件
self.filename1 = file_name
self.filename.setText(file_name)
dataset=rio.open(file_name)
# print(dataset.meta)
array = dataset.read()
self.verticalLayout.addWidget(self.static_canvas)
self._static_ax = self.static_canvas.figure.subplots()
# t = np.linspace(0, 10, 501)
# self._static_ax.plot(t)
show((dataset,1),ax=self._static_ax)
self._static_ax.figure.canvas.draw()
# dataset.closed()
def clNDVI(self):
# red波段
dataset=rio.open(self.filename1)
red = dataset.read(2)
# 近红外-NIR波段
nir = dataset.read(3)
# 数值类型转换
red = red.astype('f4')
nir = nir.astype('f4')
np.seterr(divide='ignore', invalid='ignore')
# ndvi 计算
ndvi = (nir - red) / (nir + red)
self.exportnd=ndvi
#
self._static_ax.imshow(ndvi,cmap='terrain_r')
self._static_ax.figure.canvas.draw()
# plt.imshow(ndvi, cmap='terrain_r')
# # 添加colorbar
# plt.colorbar()
def clExport(self):
fileName_save = QFileDialog.getSaveFileName(self,
"文件保存",
'',
"tiff (*.tiff)") # 设置文件扩展名过滤,用双分号间隔)
tifffile.imsave(fileName_save[0], self.exportnd)
print(fileName_save)
if __name__ == "__main__":
app = QApplication(sys.argv)
mui=mclass()
sys.exit(app.exec())
此代码课实现读取一个tif数据,并进行NDVI计算,最后把结果导出的过程
最后的结果
另一种方法的实现
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import rasterio as rio
from rasterio.plot import show
from matplotlib.backends.backend_qtagg import (
FigureCanvasQTAgg as FigureCanvas, NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure
import numpy as np
import tifffile
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(992, 700)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.OpenFile = QtWidgets.QPushButton(parent=self.centralwidget)
self.OpenFile.setGeometry(QtCore.QRect(710, 170, 75, 51))
self.OpenFile.setObjectName("OpenFile")
self.OpenFile.clicked.connect(self.Openfile)
self.FilePath = QtWidgets.QTextEdit(parent=self.centralwidget)
self.FilePath.setGeometry(QtCore.QRect(250, 180, 411, 41))
self.FilePath.setObjectName("FilePath")
self.NDVI = QtWidgets.QPushButton(parent=self.centralwidget)
self.NDVI.setGeometry(QtCore.QRect(250, 280, 75, 51))
self.NDVI.setObjectName("NDVI")
self.NDVI.clicked.connect(self.clNDVI)
self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(490, 280, 75, 51))
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.clExport)
self.horizontalLayoutWidget = QtWidgets.QWidget(parent=self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(240, 370, 541, 261))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 992, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.static_canvas = FigureCanvas(Figure(figsize=(5, 3)))
self.file_name = ""
self.baocun = ""
def Openfile(self):
# 打开文件对话框
fd = QtWidgets.QFileDialog()
fd.setFileMode(QtWidgets.QFileDialog.FileMode.ExistingFiles)
fd.exec()
self.file_name = ''.join(fd.selectedFiles())
if self.file_name:
# 在这里处理文件
self.FilePath.setText(self.file_name)
dataset = rio.open(self.file_name)
# print(dataset.meta)
array = dataset.read()
self.horizontalLayout.addWidget(self.static_canvas)
self._static_ax = self.static_canvas.figure.subplots()
show((dataset,1),ax=self._static_ax)
self._static_ax.figure.canvas.draw()
# scene = QtWidgets.QGraphicsScene()
# pix = QtGui.QPixmap(self.file_name)
# item = QtWidgets.QGraphicsPixmapItem(pix)
# scene.addItem(item)
# self.Display.setScene(scene)
# self.Display.setSceneRect(0, 0, dataset.width, dataset.height)
# self.Display.show()
def clNDVI(self):
# red波段
dataset = rio.open(self.file_name)
red = dataset.read(2)
# 近红外-NIR波段
nir = dataset.read(3)
# 数值类型转换
red = red.astype('f4')
nir = nir.astype('f4')
np.seterr(divide='ignore', invalid='ignore')
# ndvi 计算
ndvi = (nir - red) / (nir + red)
self.exportnd=ndvi
#
self._static_ax.imshow(ndvi,cmap='terrain_r')
self._static_ax.figure.canvas.draw()
# plt.imshow(ndvi, cmap='terrain_r')
# # 添加colorbar
# plt.colorbar()
def clExport(self):
file_name = self.file_name.split('/')
filename = ""
for i in file_name:
if i == file_name[len(file_name) - 1]:
break
if i == file_name[0]:
filename = i
continue
filename = filename + '/' + i
filename = filename + '/111.tif'
print(filename)
tifffile.imsave(filename, self.exportnd)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.OpenFile.setText(_translate("MainWindow", "打开文件"))
self.NDVI.setText(_translate("MainWindow", "NDVI"))
self.pushButton.setText(_translate("MainWindow", "导出"))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec())
此方法不需要进行控件的命名,所有控件都是在代码中设计好的