安装pyqt及qt-designer,界面程序和逻辑程序分离

1、安装pyqt及qt-designer

1.安装Pyqt5库
pip install PyQt5
pip install pyqt5-tools

2.在pycharm添加external tools

Designer添加:
Name:工具名字,譬如QTDesigner
Program:designer.exe程序的绝对路径,在site-packages下搜索
Working directory--designer.exe工作路径,设置为

$ProjectFileDir$

PyUIC添加
name:工具名字,譬如PyUIC
Program:python.exe的绝对路径路径
Arguments:$FileName$ -o $FileNameWithoutExtension$.py
Working dirctory:$ProjectFileDir$

3.用Designer制作界面

4.用PyUIC将UC文件转换成python文件

5、加工一下代码

(1)导入库:
from PyQt5.QtWidgets import QApplcatoin,QMainwindow
import sys

(2)主类继承QMainwindow父类,并初始化类:
class Ui_MainWindow(QMainwindow)
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.retranslateUi(self)3)添加启动语句
if __name__ == __main__:
    app = QApplication(sys.argv)     
    ui = Ui_MainWindow()             
    ui.show()
    sys.exit(app.exec_())

2、界面程序和逻辑程序分离

这么做的好处是,在我们想使用QTdesigner更改界面时,不会让新生成的界面程序替换掉原来写好的一堆

界面程序demo–classification

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'classification.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.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow_cla(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(810, 653)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_3.setStyleSheet("font: 8pt \"微软雅黑\";")
        self.groupBox_3.setObjectName("groupBox_3")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox_3)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.label_3 = QtWidgets.QLabel(self.groupBox_3)
        self.label_3.setStyleSheet("font: 12pt \"微软雅黑\";")
        self.label_3.setObjectName("label_3")
        self.gridLayout_3.addWidget(self.label_3, 1, 1, 1, 2)
        self.textEdit_3 = QtWidgets.QTextEdit(self.groupBox_3)
        self.textEdit_3.setObjectName("textEdit_3")
        self.gridLayout_3.addWidget(self.textEdit_3, 2, 3, 1, 1)
        self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox_3)
        self.textEdit_2.setObjectName("textEdit_2")
        self.gridLayout_3.addWidget(self.textEdit_2, 1, 3, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(20, 480, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout_3.addItem(spacerItem, 0, 3, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.groupBox_3)
        self.label_4.setStyleSheet("font: 12pt \"微软雅黑\";")
        self.label_4.setObjectName("label_4")
        self.gridLayout_3.addWidget(self.label_4, 2, 1, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(240, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem1, 2, 0, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem2, 1, 0, 1, 1)
        self.gridLayout.addWidget(self.groupBox_3, 1, 1, 1, 1)
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setStyleSheet("\n"
"font: 8pt \"微软雅黑\";")
        self.groupBox_2.setObjectName("groupBox_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label = QtWidgets.QLabel(self.groupBox_2)
        self.label.setObjectName("label")
        self.verticalLayout_2.addWidget(self.label)
        self.gridLayout.addWidget(self.groupBox_2, 1, 0, 1, 1)
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setStyleSheet("font: 8pt \"微软雅黑\";")
        self.groupBox.setObjectName("groupBox")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.label_5 = QtWidgets.QLabel(self.groupBox)
        self.label_5.setObjectName("label_5")
        self.verticalLayout_3.addWidget(self.label_5)
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.comboBox = QtWidgets.QComboBox(self.groupBox)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.gridLayout_2.addWidget(self.comboBox, 0, 0, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout_2.addWidget(self.pushButton, 0, 1, 1, 1)
        self.verticalLayout_3.addLayout(self.gridLayout_2)
        self.horizontalLayout_3.addLayout(self.verticalLayout_3)
        self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 2)
        self.gridLayout.setColumnStretch(0, 4)
        self.gridLayout.setColumnStretch(1, 4)
        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 4)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 810, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox_3.setTitle(_translate("MainWindow", "结果"))
        self.label_3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">准确率</p></body></html>"))
        self.label_4.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">类别</p></body></html>"))
        self.groupBox_2.setTitle(_translate("MainWindow", "图片"))
        self.label.setText(_translate("MainWindow", "TextLabel"))
        self.groupBox.setTitle(_translate("MainWindow", "介绍"))
        self.label_5.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">可选模型的图像分类程序</p></body></html>"))
        self.comboBox.setItemText(0, _translate("MainWindow", "Alexnet"))
        self.comboBox.setItemText(1, _translate("MainWindow", "VGGnet"))
        self.comboBox.setItemText(2, _translate("MainWindow", "resnet"))
        self.comboBox.setItemText(3, _translate("MainWindow", "mobilenet"))
        self.pushButton.setText(_translate("MainWindow", "图像分类"))

逻辑程序demo–run_classification

from PyQt5.QtWidgets import QApplication, QMainWindow
from classification import Ui_MainWindow_cla
from PyQt5 import QtCore, QtGui, QtWidgets
import cv2
import json
from alexnet.model import AlexNet
from resnet.model import resnet34
from vggnet.model import vgg
from mobilenet.model_v2 import MobileNetV2
import sys
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import transforms
model_list = ["alexnet","vggnet","resnet","mobilenet"]


class MyMainwindow_cla(QMainWindow, Ui_MainWindow_cla):

    def __init__(self,parent=None):
        super(MyMainwindow_cla,self).__init__(parent)
        self.setupUi(self)
        self.comboBox.currentIndexChanged[int].connect(lambda val: self.upmodel(val))
        self.pushButton.clicked.connect(self.button_image_open)
        self.model_type = 'alexnet'

    def upmodel(self,id):
        print(id)
        self.model_type = model_list[id]
        print(self.model_type)

    def button_image_open(self):
        if self.model_type == "alexnet":
            print("这次图片预测使用的时alexnet模型")
            img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
            img = Image.open(img_name)
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
            data_transform = transforms.Compose(
                [transforms.Resize((224, 224)),
                 transforms.ToTensor(),
                 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
            img = data_transform(img)
            # expand batch dimension
            img = torch.unsqueeze(img, dim=0)
            # print(img)
            json_path = r'./alexnet/class_indices.json'
            json_file = open(json_path, "r")
            class_indict = json.load(json_file)
            # create model
            model = AlexNet(num_classes=5).to(device)
            weights_path = r"./alexnet/AlexNet.pth"
            model.load_state_dict(torch.load(weights_path))
            model.eval()
            with torch.no_grad():
                output = torch.squeeze(model(img.to(device))).cpu()
                predict = torch.softmax(output, dim=0)
                # print(predict)
                predict_cla = torch.argmax(predict).numpy()
                out_class = class_indict[str(predict_cla)]
                out_pre=predict[predict_cla].numpy()
                print(out_class)
                print(out_pre)
                self.textEdit_2.setText(str(out_pre))
                self.textEdit_3.setText(str(out_class))#要字符串的形式,str
            jpg = QtGui.QPixmap(img_name)
            self.label.setScaledContents(True)#图片大小自适应label窗口大小

            self.label.setPixmap(jpg)#在label上显示图片
        if self.model_type == "resnet":
            print("这次图片预测使用的是resnet34模型")
            img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
            img = Image.open(img_name)
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
            data_transform = transforms.Compose(
                [transforms.Resize(256),
                 transforms.CenterCrop(224),
                 transforms.ToTensor(),
                 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
            img = data_transform(img)
            # expand batch dimension
            img = torch.unsqueeze(img, dim=0)
            # print(img)
            json_path = r'./resnet/class_indices.json'
            json_file = open(json_path, "r")
            class_indict = json.load(json_file)
            # create model
            model = resnet34(num_classes=5).to(device)
            weights_path = r"./resnet/resNet34.pth"
            model.load_state_dict(torch.load(weights_path))
            model.eval()
            with torch.no_grad():
                output = torch.squeeze(model(img.to(device))).cpu()
                predict = torch.softmax(output, dim=0)
                # print(predict)
                predict_cla = torch.argmax(predict).numpy()
                out_class = class_indict[str(predict_cla)]
                out_pre = predict[predict_cla].numpy()
                print(out_class)
                print(out_pre)
                self.textEdit_2.setText(str(out_pre))
                self.textEdit_3.setText(str(out_class))  # 要字符串的形式,str
            jpg = QtGui.QPixmap(img_name)
            self.label.setScaledContents(True)  # 图片大小自适应label窗口大小

            self.label.setPixmap(jpg)  # 在label上显示图片
        if self.model_type == "vggnet":
            print("这次图片预测使用的是vggnet模型")
            img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
            img = Image.open(img_name)
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
            data_transform = transforms.Compose(
                [transforms.Resize((224, 224)),
                 transforms.ToTensor(),
                 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
            img = data_transform(img)
            # expand batch dimension
            img = torch.unsqueeze(img, dim=0)
            # print(img)
            json_path = r'./vggnet/class_indices.json'
            json_file = open(json_path, "r")
            class_indict = json.load(json_file)
            # create model
            model = vgg(model_name="vgg16", num_classes=5).to(device)
            weights_path = r"./vggnet/vgg16Net.pth"
            model.load_state_dict(torch.load(weights_path))
            model.eval()
            with torch.no_grad():
                output = torch.squeeze(model(img.to(device))).cpu()
                predict = torch.softmax(output, dim=0)
                # print(predict)
                predict_cla = torch.argmax(predict).numpy()
                out_class = class_indict[str(predict_cla)]
                out_pre = predict[predict_cla].numpy()
                print(out_class)
                print(out_pre)
                self.textEdit_2.setText(str(out_pre))
                self.textEdit_3.setText(str(out_class))  # 要字符串的形式,str
            jpg = QtGui.QPixmap(img_name)
            self.label.setScaledContents(True)  # 图片大小自适应label窗口大小

            self.label.setPixmap(jpg)  # 在label上显示图片

        # if self.model_type == "mobilenet":
        else:
            print("这次图片预测使用的是mobilenet模型")
            img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
            img = Image.open(img_name)
            device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
            data_transform = transforms.Compose(
                [transforms.Resize(256),
                 transforms.CenterCrop(224),
                 transforms.ToTensor(),
                 transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
            img = data_transform(img)
            # expand batch dimension
            img = torch.unsqueeze(img, dim=0)
            # print(img)
            json_path = r'./mobilenet/class_indices.json'
            json_file = open(json_path, "r")
            class_indict = json.load(json_file)
            # create model
            model = MobileNetV2(num_classes=5).to(device)
            weights_path = r"./mobilenet/MobileNetV2.pth"
            model.load_state_dict(torch.load(weights_path,map_location=device))
            model.eval()
            with torch.no_grad():
                output = torch.squeeze(model(img.to(device))).cpu()
                predict = torch.softmax(output, dim=0)
                # print(predict)
                predict_cla = torch.argmax(predict).numpy()
                out_class = class_indict[str(predict_cla)]
                out_pre = predict[predict_cla].numpy()
                print(out_class)
                print(out_pre)
                self.textEdit_2.setText(str(out_pre))
                self.textEdit_3.setText(str(out_class))  # 要字符串的形式,str
            jpg = QtGui.QPixmap(img_name)
            self.label.setScaledContents(True)  # 图片大小自适应label窗口大小

            self.label.setPixmap(jpg)  # 在label上显示图片


if __name__ == "__main__":

    app = QApplication(sys.argv)
    myWin = MyMainwindow_cla()
    myWin.show()
    sys.exit(app.exec_())


版权声明:本文为taylorman原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。