版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/90454379
2022更:链接:https://pan.baidu.com/s/1Qw145uoRgmaks3MaGlTEOQ
提取码:scyf。仅限本博客核心代码~(好多人私信(^-^)V,现直接百度云盘见吧)

- 写在前面


  本科毕业设计终于告一段落了。特写博客记录做毕业设计(路面裂纹识别)期间的踩过的坑和收获。希望对你有用。

  目前有:

    1.Tensorflow&CNN:裂纹分类

    2.Tensorflow&CNN:验证集预测与模型评价

    3.PyQt5多个GUI界面设计  
  本篇讲GUI界面的设计。设计目标:实现用户对路面裂纹快速检测与识别,有三个界面:主界面、裂纹快速识别界面、图像处理测试界面。

- 环境配置安装


  运行环境:Python3.6、Spyder、Qt Designer

  依赖的模块:PyQt5、mysql等

  值得注意的是:我安装PyQt5模块时,按照网上方法,如下:

pip install PyQt5
pip install PyQt5-tools

  却发现找到Qt Designer的应用程序,(其实是有的,在C盘的某个角落,可以用everything小工具可以找到)。
  于是乎,我就直接使用了PyQt5运行环境合集,内含Qt Designer(主要用来设计界面以及UI文件转换成PY)。
  下载地址如下:

WinPyQt5.9-32bit-3.5.3.1

- 开始工作


1. 界面设计

  打开Qt Designer:


  可以参照网上或书籍上关于Qt Designer的资料,简单设计三个界面,如下:

  Qt Designer设计的文件后缀为.ui,需要将其转换为.py文件。打开刚才下载的PyQt5合集中的WinPython Command Prompt,输入:

pyuic5 -o D:\WinPyQt5.9-32bit-3.5.3.1\test\XX.py D:\WinPyQt5.9-32bit-3.5.3.1\test\XX.ui

  即可得到界面的Python文件。

2. 界面功能实现

2.1 主界面

  主界面功能比较简单,主要是用户对功能的选择以及对该系统的了解。

from PyQt5.QtWidgets import QMainWindow,QMessageBox,QApplication
from main_gui import Ui_MainWindow
import sys
import time
from PyQt5.QtGui import QPixmapclass MainWindow(QMainWindow):def __init__(self,parent = None):super(MainWindow,self).__init__(parent=parent)#调用父类的initglobal uiui = Ui_MainWindow()ui.setupUi(self)def about_us(self):msgBox = QMessageBox(QMessageBox.NoIcon, '关于','XX的本科毕业设计')msgBox.setIconPixmap(QPixmap(".//icon//me3.jpg"))msgBox.exec()def function_exp(self):msgBox = QMessageBox(QMessageBox.NoIcon, '功能说明','')msgBox.exec()def operate_exp(self):msgBox = QMessageBox(QMessageBox.NoIcon, '操作说明','')msgBox.exec()def jump_to_1(self):passdef jump_to_2(self):   passdef closeEvent(self, event):reply = QMessageBox.question(self, '提醒',"确定退出?", QMessageBox.Yes |QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:event.accept()else:event.ignore()
if __name__ == '__main__':    app = 0app = QApplication(sys.argv)myMainWindow = MainWindow()#自定义的类例化myMainWindow.show()time.sleep(10)sys.exit(app.exec_())

  而对于转换的主界面的py代码(注意:本文将转换成的.py文件命名为xx_gui.py,而其对应的.py文件命名为xx_win.py),找到如下语句:

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

  修改为:

        self.retranslateUi(MainWindow)self.crack_info.triggered.connect(MainWindow.jump_to_1)self.img_processing.triggered.connect(MainWindow.jump_to_2)self.function_exp.triggered.connect(MainWindow.function_exp)self.operate_exp.triggered.connect(MainWindow.operate_exp)self.about_us.triggered.connect(MainWindow.about_us)QtCore.QMetaObject.connectSlotsByName(MainWindow)

  这样,主界面功能就实现了。

2.2 裂纹快速识别界面

  现已经利用CNN以及图像处理技术实现了对裂纹的识别与检测。这里主要是怎么将结果显示在界面上。这里参照了博客使用PyQt5创建带文件对话框和文本对话框的ui窗口程序。

from PyQt5.QtWidgets import (QMainWindow,QApplication,QFileDialog)
from PyQt5 import QtCore
from crack_detect_gui import Ui_MainWindow2
from prediction import prediction
import sys
import threading
import time
from img_processing import img_processing
import numpy as np
from mysql_save import save_mysqlclass MainWindow2(QMainWindow):_signal=QtCore.pyqtSignal(str)#自定义信号def __init__(self,parent = None):super(MainWindow2,self).__init__(parent=parent)#调用父类的initself.img_opened = Falseself.imgs_opened = Falseglobal uiui = Ui_MainWindow2()ui.setupUi(self)self.mainWindow2=ui.MainWindow2ui.output_info.clear()ui.file_name.clear()self._signal.connect(self.print_info)def back(self):passdef reset(self,parent = None): passdef open_file(self):self.img_name = QFileDialog.getOpenFileName(self,"打开","","图片(*.jpg;*.png)")ui.file_name.setPlainText(self.img_name[0])self.img_opened = True  def open_files(self):self.imgs_name = QFileDialog.getOpenFileNames(self,"打开","","多个图片(*.jpg;*.png)")imgs_name=''for img_name in self.imgs_name[0]:imgs_name=imgs_name+img_name+'\n'ui.file_name.setPlainText(imgs_name)self.imgs_opened = Truedef print_info(self,pri_str):ui.output_info.appendPlainText(pri_str)ui.output_info.show()def output_info_thread(myMainWindow):t1=time.time()Opened = Falsewhile(True):if myMainWindow.img_opened==True:imgs_path = myMainWindow.img_name[0].replace("/","//")breakelif myMainWindow.imgs_opened==True:imgs_path=[]for path in myMainWindow.imgs_name[0]:imgs_path.append(path.replace("/","//"))break Opened = TruemyMainWindow._signal.emit("当前线程:%s" %threading.current_thread().name)timeArray = time.localtime(t1)now=time.strftime("%Y_%m_%d", timeArray)try:if(Opened):s1 = "正在进行裂纹识别评估"myMainWindow._signal.emit(s1)kinds=prediction(imgs_path)s2='裂纹图片   裂纹类型   裂纹长度    裂纹面积    裂纹最大宽度    裂纹最小宽度   裂纹平均宽度'myMainWindow._signal.emit(s2)data= np.empty(shape=[0, 8])for i in range(len(kinds)):if len(kinds)==1:name=imgs_path[::-1].split('//', 1)[0][::-1]else:name=imgs_path[i][::-1].split('//', 1)[0][::-1]if kinds[i]=='无裂纹':crack_info=[imgs_path[i],kinds[i],'','','','']elif len(kinds)==1:crack_info=img_processing(imgs_path,kinds[i])else:crack_info=img_processing(imgs_path[i],kinds[i])s=name+'   '+crack_info[0]+' '*5+crack_info[1]+' '*7+crack_info[2]+\' '*11+crack_info[3]+' '*12+crack_info[4]+' '*12+crack_info[5]myMainWindow._signal.emit(s)new_crack_info=[name,crack_info[0],crack_info[1],crack_info[2],crack_info[3],crack_info[4],crack_info[5],now]data=np.append(data, [new_crack_info], axis = 0)t2=time.time()database='crack_info'try:save_mysql(database,data)myMainWindow._signal.emit('数据已存入'+database+'数据库中')except:myMainWindow._signal.emit('数据存储失败,请检查数据库是否打开!')time_comsume=round(t2-t1,2)myMainWindow._signal.emit('共耗时: '+str(time_comsume)+' s')myMainWindow._signal.emit("****************处理完毕****************")except BaseException as e1:print(e1)except EnvironmentError as e2:print(e2)except (OSError,WindowsError,MemoryError,NameError,UnboundLocalError,ReferenceError,RuntimeError,NotImplementedError,UnicodeDecodeError,UnicodeEncodeError,UnicodeError,UnicodeTranslateError,RuntimeWarning,UserWarning) as e3:print(e3)   if __name__ == '__main__':app = 0if not QApplication.instance():app = QApplication(sys.argv)else:app = QApplication.instance()myMainWindow = MainWindow2()#自定义的类例化myMainWindow.show()t1 = threading.Thread(target = output_info_thread, args = (myMainWindow,))t1.start()time.sleep(10)sys.exit(app.exec_())

  同理,将该界面的XX_gui.py修改为:

        self.retranslateUi(MainWindow2)self.pushButton.clicked.connect(MainWindow2.open_file)self.pushButton_2.clicked.connect(MainWindow2.open_files)self.pushButton_3.clicked.connect(MainWindow2.reset)self.pushButton_4.clicked.connect(MainWindow2.back)QtCore.QMetaObject.connectSlotsByName(MainWindow2)self.MainWindow2=MainWindow2mainWindow2=self.MainWindow2

2.3 图像处理测试界面

import sys
from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QFileDialog,QWidget
#from img_pro_gui_code import Ui_Dialog
from img_pro_gui import Ui_Dialog
from img_processing_plot import img_processing
#from main_win import MainWindow
class Picture(QWidget):def __init__(self):super(Picture,self).__init__()#调用父类的initglobal uiui = Ui_Dialog()ui.setupUi(self)self.imgs_data=ui.imgs_dataself.dialog=ui.dialogdef reset(self):passdef back(self):passdef open_file(self):imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")self.path=imgName        img_path=self.path.replace("/","//")imgs=img_processing(img_path)for i in range(len(imgs)):jpg = QtGui.QPixmap(imgs[i]).scaled(self.imgs_data[i].width(), self.imgs_data[i].height())self.imgs_data[i].setPixmap(jpg)if __name__ == "__main__":app=0app = QtWidgets.QApplication(sys.argv)my = Picture()my.show()sys.exit(app.exec_())

  值得一提的是,这里的多图片显示功能,我是先将图像处理测试程序中产生的图片保存到本地再使用QPixmap方法导入并显示。

  同理,该界面所对应的XX_gui.py文件中改写为:

        self.retranslateUi(Dialog)self.choose.clicked.connect(Dialog.open_file)self.clear.clicked.connect(Dialog.reset)self.back.clicked.connect(Dialog.back)QtCore.QMetaObject.connectSlotsByName(Dialog)self.imgs_data=[self.img_source,self.img_blur,self.img_canny,self.img_cut,self.img_close,self.img_open,self.img_domain,self.img_skeleton]imgs_data=self.imgs_dataself.dialog=Dialogdialog=self.dialog

3. 界面跳转与重置

3.1主界面与裂纹快速识别界面

  主界面跳转界面1修改为:

    def jump_to_1(self):#myMainWindow.hide()   #如果没有这一句,关闭子界面后就会关闭程序self.ui_1=MainWindow2()self.ui_1.show()crack_detect(self.ui_1)

  裂纹快速识别界面上返回功能是直接关闭当前界面,重置功能是将界面数据清零并再次启动多线程。

    def back(self):self.mainWindow2.close()def reset(self,parent = None): self.img_opened = Falseself.imgs_opened = Falseui.output_info.clear()ui.file_name.clear()t1 = threading.Thread(target = output_info_thread, args = (myMainWindow,))t1.start()

3.2主界面与图像处理测试界面

  主界面跳转界面2修改为:

    def jump_to_2(self):   #myMainWindow.hide()   #如果没有这一句,关闭子界面后就会关闭程序self.ui_2=Picture()self.ui_2.show()

  图像处理测试界面上返回功能的实现同上,重置功能是将界面数据清零。

    def reset(self):for label in self.imgs_data:label.clear()def back(self):self.dialog.close()

- 结果展示


  在命令行运行主界面程序,结果如下(以Gif展示):

- 写在最后


  由于时间有限且初次设计GUI界面(经验不足),界面比较丑,请见谅。若有问题,欢迎留言。

PyQt5多个GUI界面设计相关推荐

  1. Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统(包括语音生成、识别等前沿黑科技)

    Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习.深度学习.大数据.云计算等)推荐系统(包括语音生成.识别等前沿黑科技) 导读 基于Python的GUI界面设计的一套 ...

  2. 【Qt设计开发】GUI界面设计开发

    文章目录 一.Qt简介和下载安装 二.Qt入门 2.1 创建第一个项目 2.2 快捷键和命名规范 2.3 Qt项目和VS2022项目相互转换 三.Qt基础 3.1 Qt对象树和窗口坐标系概念 3.2 ...

  3. 30个真棒的(免费iPhone,iPad IOS)的GUI 界面设计元素模板 做iphone开发的福音

    30个真棒的(免费iPhone,iPad IOS)的GUI 界面设计元素模板 做iphone开发的福音 转自:http://www.cnblogs.com/web8cn/archive/2012/07 ...

  4. [java/初学者/GUI编程]GUI界面设计——界面组件类

     前言 GUI,即图形用户界面,其英文全称是Graphics User Interface. 它是基于图形的界面,windows就是一个图形用户界面的操作系统,而DOS是基于命令提示符的操作系统,GU ...

  5. 基于MATLAB的数字图像处理系统GUI界面设计

    基于MATLAB的数字图像处理系统GUI界面设计 图像读入 从图形文件中读入图像 imread Syntax: A = imread(filename, fmt) filename:指定的灰度或彩色图 ...

  6. 【开源分享】基于Python+OpenCV+PyQt5车牌识别(GUI界面)

    亲测无错:基于Python+OpenCV+PyQt5车牌识别(GUI界面)绝对可以用的!!!!! 基于Python+OpenCV+PyQt5车牌识别(GUI界面) 参考文档

  7. gui界面设计心得体会 python_关于GUI的一点心得体会

    [Fig 文件方式,即使用菜单 File->New->GUI 来设计界面 ] 首先值得注意的是, 在低版本 matlab 上 制作的含 GUI 的 m 文件一般不能在高版 本的 matla ...

  8. ROS项目开发实战(三)——使用QT进行ROS的GUI界面设计(详细教程附代码!!!)

    序 本篇博客主要介绍怎么使用qt对ros进行gui设计与调试,包括使用列表视图显示ROS话题发布与接收的消息,点击QT按钮按钮进行ros消息的发布. 在阅读本文之前没有安装QT与配置环境可以参考博文: ...

  9. 调用科大讯飞语音合成离线SDK的基础上调用pyqt5模块编写gui界面

    程序说明 该程序是继我上一次调用科大讯飞语音合成离线SDK,用Python写了一个文本转语音的程序的进一步开发,这次开发是用pyqt5模块和其自带的designer做了一个gui界面. 程序展示 该程 ...

  10. matlab 版 数独小游戏 GUI界面设计

    近期,由于各种原因,接触到了matlab版的数独小游戏,需要做GUI界面.由于之前本科的时候自己也做过简单的界面涉及,就以为很简单,结果,piapia打脸.数独中的数字是在table中显示的,为了将题 ...

最新文章

  1. C# 大型对象堆学习总结
  2. 日历,日期类(copy)
  3. eclipse mac 下载php文件夹,PHP Pydev Eclipse (linux or mac)
  4. 用友U8配置动态密码认证
  5. linux 限制连接时间,linux抵御DDoS攻击方法 通过iptables限制TCP连接和频率
  6. 云效DevOps实践-代码评审
  7. python和别的脚本语言_PHP与Python与其它脚本语言
  8. [ASP.NET MVC]让Html.RenderAction支持Lamda表达式
  9. asp.net core3.0 mvc 用 autofac
  10. 源码推荐:多图无缝滚动控件,多视图控制器间切换
  11. 编辑器安卓手机版_手机上最专业的视频编辑器,内购版!
  12. ISO27001标准
  13. 十日均线算法oracle,十日均线买卖法则,简单管用!
  14. HTML将div层级升到最高,CSS层级嵌套关系详解
  15. 融会贯通,从oracle...,融会贯通Oracle数据库的25条基本知识:
  16. 机器学习5—分类算法之随机森林(Random Forest)
  17. Nginx 502的解决方法
  18. 东北地区博友链接集合(陆续增加中)
  19. 设计模式(2)六大原则(七大原则)
  20. Node之Express服务器启动安装与配置

热门文章

  1. autojs 复制到粘贴板_JS复制到剪贴板示例代码
  2. csgo删除服务器地图在哪个文件夹,CSGO de_cache地图
  3. 在实现视频播放器的步骤client(三)风行网络电影列表
  4. [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误解决方法总结
  5. tlwn726n无线网卡Linux驱动,tl-wn726n无线网卡驱动下载
  6. vulnhub--odin
  7. 学计算机辅助设计的,计算机辅助设计学习方法
  8. 微博数据各字段的含义
  9. 树莓派安装Ubuntu系统
  10. Kettle数据抽取实战之四:网页数据抽取