基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 

        当前流行的一种常见的前后端分离模式是vue+flask,vue+flask模式的前端和后端之间进行数据的传递通常是借助 API(应用程序编程接口)来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如,前端可能通过发送 HTTP 请求到后端的 API 来获取数据,后端则通过 API 响应这些请求并返回数据给前端。     

        而本项目的主体框架是基于pyside的,所有的数据交互都是在pyside主程序内部流动。pyside的数据交互的载体主要就是信号与槽,前后端通过发射信号到槽函数来实现数据交互和显示刷新。这一点与vue+flask模式区别很大,vue+flask模式是天生自带前后端分离,pyside如果不用心去做,不太容易做到前后端分离。看过很多的博主提供的demo都是课后作业水平的,只能说实现了基本功能,前后端分离不彻底,移植困难,修改困难,信号、变量、槽函数分布层级不清,引用和定义盘根错节(好吧我承认,其实我开始做的项目也是这样的),当需要修改或者增减画面时牵一发而动全身。所以本项目尽力探索,怎样实现前后端的彻底分离。原则上所有显示特征的描述都在前端的designer中实现,而后端的功能和计算脚本只提供触发的信号和更新的逻辑,无须关心任何显示特征,这样就实现了前后端分离,分工种协作。

 • 关于信号和槽 

        特别强调的一点:必须要坚持一个原则,除非是画面的初始化,所有的前端部件的所有刷新都必须通过槽函数来实现,信号的发射触发槽函数的执行。因为pyside的线程管理和刷新机制会根据信号和槽的连接定义以及信号触发自动安排部件的显示刷新,如果出现了计划外的部件刷新,就会破坏程序的刷新节奏和引发读写竞争,程序就有跑死的风险。在我初学的阶段就犯过这个错误,前端画面有一个显示系统时间的text_label,没有使用信号与槽,而是用python自带的定时器定时重写text_label的显示内容,结果程序每过几个小时就死机,需要重启程序才能恢复。花费了很大力气来排除这个BUG,最后做成了秒周期的信号,发射信号到槽函数来重写显示内容,解决了这个问题。

• 关于项目的层级

        有一些变量和信号、槽需要做成全局层级的,比如系统时间、用户名、系统参数等等,这些变量和信号、槽的定义和操作不依赖前端界面,就是说无论怎样切换前端界面,它们都是单独存在的。为达到这个目的,一个方法是在前端界面的代码中将它们声明为global(全局级),但是如果将本项目移植到更高一级的项目时,就有可能会遇到global级别上的混淆。所以一些python的使用教程中建议谨慎使用global声明是有道理的。为了实现全局信号,在项目中设一个全局的信号对象(QObject),在分画面中导入全局信号并为之编写和连接槽函数。(在更大型和更复杂的应用程序中,会使用事件总线,事件总线作为中央枢纽的类,负责管理和分发事件。这样,发送者和接收者之间不需要直接引用彼此,从而降低了耦合度。在后面的范例中会有用到事件总线)

        而另一些变量和信号、槽是局部的,比如某个画面的某个部件的显示刷新函数,这些就要做在画面的代码中,这样做的好处是可以简化程序和实现模块化结构,当删除画面的同时,变量和信号、槽随之删除;增加画面的同时,增加新的变量和信号、槽。

        层级一个典型的应用就是系统时间的显示,在所有的窗口的时间显示部件上的显示内容,都是由同一个全局的变量提供,把这个变量用一个全局的信号每秒发射一次,在需要使用这个信号的窗口编写接收信号的槽函数,对窗口内的时间显示部件进行刷新。

        至此,项目的整体规划基本完成,下面进入实际的编程阶段。

        在pycharm中新建项目,并构建如下的文件目录:     

├── AI/    # AI相关的内容
│   ├── media/    #  图像文件和其他媒体文件
│   │   ├── mark/   #  标注得到的图像,用来训练
│   │   ├── predict/   #  预测后的图像
│   │   └── source/   #  原始图像
│   └── models/       #  模型
├── database/     # 数据库相关
├── gui/          # 界面文件
│   ├── ui_src/   #  界面需要的源文件,比如图标、背景资源、颜色定义等
│   └── uis/   # 界面文件
│       └── __init__.py   #  有了这个文件就可以把文件夹变为包,在这个文件中还可以定义import *的范围
├── main.py     # 主脚本
└── settings/     # 设置项
    └── __init__.py

        

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印&#xff1a…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计? 什么是面向对象的分析和设计? 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计? 分析,强调是对问题和需求的调查研究,不是解决方案。例如&#x…

Nginx:限流限速

1. 什么是限流限速? 限流限速是Nginx运维中一个非常重要的功能,用于防止服务器过载和保护资源免受滥用。它可以通过限制客户端的请求速率或上传/下载速度来实现。 限流:控制单位时间内允许处理的请求数量。这有助于防止过多的并发请求导致服务器性能下降或崩溃。限速:限制…

探索 JMeter While Controller:循环测试的奇妙世界

嘿,宝子们!今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器,它就像是一把神奇的钥匙,能帮我们打开循环测试的大门,模拟出各种各样复杂又有趣的场景哦! 一、While 控制器初印象 想象一下,你…

迈向AGI,3、2、1,2025上链接!

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 往期精彩文章推荐 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索,加强思想碰撞,链接全…

JVM对象内存分配

1 栈上分配 栈空间随着方法执行完毕而回收通过栈上分配对象内存空间的方式,减少对堆空间的使用,从而减少gc的压力,提升程序性能 逃逸分析:分析对象的作用域,判断对象所需内存是否可以在栈上分配当对象没有被外部方法或…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组,解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

vue 项目集成 electron 和 electron 打包及环境配置

vue electron 开发桌面端应用 安装 electron npm i electron -D记得加上-D,electron 需添加到devDependencies,如果添加到dependencies后面运行可能会报错 根目录创建electron文件夹,在electron文件夹创建main.js(或者backgrou…

leecode1143.最长公共子序列

这道题目和最长重复子数组是一个类型的不同之处在于text1[i]!text2[j]时dp[i][j]时他的值是继承上一行或上一列的最大值,二者dp数组的含义也不一样,这里的dp[i][j]表示的是以text[i]和text2[j]为结尾的子序列最大长度,这也是导致两种问题当判…

通过 4 种方式快速将音乐从 iPod 传输到 Android

概括 在 iPod 上听音乐很酷,但是当您拥有最新的 Android 手机时,也许您想在新手机上欣赏 iPod 音乐。那么,你的计划是什么?如何将音乐从 iPod 传输到 Android? 如果您担心这个问题,请看看下面的方法。他们…

flutter在windows平台中运行报错

PS D:\F\luichun> flutter run当运行flutter项目时,【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…

Docker Compose编排

什么是 Docker Compose? Docker Compose 是 Docker 官方推出的开源项目,用于快速编排和管理多个 Docker 容器的应用程序。它允许用户通过一个 YAML 格式的配置文件 docker-compose.yml 来定义和运行多个相关联的应用容器,从而实现对容器的统一管理和编…

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗? 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM?2.2 什么是JDK?2.3 什么是JRE? 前言 点个免费的赞和关注,有错误的地方请指出,看个人主页有…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同,我们收集了2000多种不同零售产品的35万张图像,这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究,该研究具…

Spark大数据处理引擎详解

一、概念 Spark是一种快速、通用、可扩展的大数据分析引擎,它基于内存计算的大数据并行计算框架,能够显著提高大数据环境下数据处理的实时性,同时保证高容错性和高可伸缩性。Spark于2009年诞生于加州大学伯克利分校AMPLab,2010年…

服务器数据恢复—离线盘数超过热备盘数导致raidz阵列崩溃的数据恢复

服务器数据恢复环境&故障: 一台配有32块硬盘的服务器在运行过程中突然崩溃不可用。经过初步检测,基本上确定服务器硬件不存在物理故障。管理员重启服务器后问题依旧。需要恢复该服务器中的数据。 服务器数据恢复环境: 1、将服务器中硬盘…

安装教程:慧集通集成平台(DataLinkX)智能体客户端安装操作(Linux/windows/mac)

1.下载客户端 使用提供的账号登录集成平台后台(https://www.datalinkx.cn/),点击左侧菜单栏【智能体】→【智能体】进入到智能体列表界面,在该界面我们找到功能栏中的下载按钮点击则会弹出下载界面,在该界面我们可以选择不同的系统操作系统来下载对应版…

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含:发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习,学员可以掌握Biomod2模型最新版本的使用方法,最新版包含12个模型(ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…

贵州省贵安新区地图+全域数据arcgis格式shp数据矢量路网地名+卫星影像底图下载后内容测评

贵州省贵安新区地图全域数据arcgis格式shp数据矢量路网地名卫星影像底图 贵安新区地图是一款基于ArcGIS格式的地理信息系统数据集,包含2022年3月更新的详尽矢量路网、地名信息以及卫星影像底图。这款数据集是针对贵安新区这一特定区域设计的,对于规划、…