PyQt图像软件(基于项目的学习)

目录

Qt学习(5.14.2)

基础知识

类的实质是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型,不同的是它是一种复杂的数据类型。因为它的本质是数据类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。

  • 2.GUI

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面

  1. 3.4.14——QT
    qt creator更改完ui文件后,执行.py主程序发现界面没有更改。
  2. 检查发现没有编译更新ui——py文件,>查看uic.bat文件,路径无误。

  3. 检查pyuic5.exe是否安装成功在这里插入图片描述

采用cmd方式输入在这里插入图片描述
初步判断文件名 software hzh中有空格???

  1. sys模块主要是针对与Python解释器相关的变量和方法,不是主机操作系统。
  2. Pycharm External tool添加在这里插入图片描述

4.15 问题——.ui 转为.py

Pycharm配置外置工具Pyuic后出错

  • 报错1 “XXX不是可执行程序也不是有效文件"
    思路1:文件名中有空格,之前在命令行中也遇到这种情况,使用cd:方式解决
    方法无效
    思路2:编译时没有选中.ui文件 方法无效
    思路3:程序路径设置有问题。经查证需要使用与python虚拟环境同一目录下的pyuic.bat文件,此处应为37X86环境,在Scripts目录下查找。报错消失,但出现新报错:

  • 报错2 运行过程出现问题 exit code 1

在这里插入图片描述
在这里插入图片描述
pyuic.bat运行不正常

后续:加装固态然后重装软件,pyuic竟然可以用了!
在这里插入图片描述
貌似之前我用的是.exe文件。


注意Qt版本:msvc和MinGW版本的区别。msvc使用的是vs的编译器,这个版本主要用于PC开发;MinGW版本使用MinGW编译器,主要用于跨平台开发。两个版本的Qt配置方式完全不同。因此在网上搜配置方法时候,要加上msvc或者MinGW这样的关键字一块搜索。网上大部分内容是关于MinGW版本的配置方法,我本地使用的是msvc版本。Msvc版本配置比较简单;MinGW版本需要下载cmake自行编译opencv。


C:\Users\17385>python
Python 3.8.5 (default, Sep  3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32

Warning:
This Python interpreter is in a conda environment, but the environment has
not been activated.  Libraries may fail to load.  To activate this environment
please see https://conda.io/activation

Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

C:\Users\17385>python -m PyQt5.uic.pyuic demo.ui -o demo.py
Error: No such file or directory: "demo.ui"

C:\Users\17385>python -m Pyqt5.uic.pyuic demo3.ui -o demo3.py
D:\software hzh\Ancona pack\python.exe: Error while finding module specification for 'Pyqt5.uic.pyuic' (ModuleNotFoundError: No module named 'Pyqt5')

C:\Users\17385>python D:\software hzh\Ancona pack\envs\env_py37_x86\Lib\site-packages\PyQt5\uic\pyuic.py -o demo3.py demo3.ui
python: can't open file 'D:\software': [Errno 2] No such file or directory

C:\Users\17385>cd: D:\software hzh\Ancona pack
文件名、目录名或卷标语法不正确。

C:\Users\17385>D:

D:\> D:\software hzh\Ancona pack
'D:\software' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

D:\>cd:  D:\software hzh\Ancona pack
文件名、目录名或卷标语法不正确。

D:\>cd: D:\software hzh\Ancona pack
文件名、目录名或卷标语法不正确。

伙伴关系

热键&快捷键(相当于快速跳转至指定部件处)
Tab顺序

信号与槽

definition

信号:是由对象或控件发射出去的消息
事件:比如单机一下按钮,按钮往外发射消息(这是信号)
槽:这些发射的信号需要代码来拦截(可以认为是传感器来感知)

槽本质上是一个函数或方法

信号和槽是多对多的关系

在这里插入图片描述
实现图中需求
对于checkbox,信号与槽选择 toggle(bool)与setXXX在这里插入图片描述

按钮
widget=QWidget()
btn=QPushButton(widget)
btn.setText("按钮")
#连接信号与槽
btn.clicked.connect(onClick_Button)

#
def onClick_Button():
    print("1")
    print("widget.x()=%d"%widget.x())
    print("widget.width()=%d" % widget.width())
设置控件提示信息

设置按钮提示信息
Q: #没有这个窗口不显示??
self.setCentralWidget(mainFrame)

为按钮设置超链接:

 label3.setText("<a href='https://baidu.com'>进行跳转.</a>")
label3.setOpenExternalLinks(True)
QLineEdit控件与回显模式

Echo Mode(回显模式)
1、Normal
2、NoEcho(Linux常见)
3、Password
4、PasswordEchoOnEdit

signal&slot

4.16 问题

关于slider滑块值转化为小数的方法
将数值扩大10n倍,再将获得的value除以10n,以获得n位小数

基础知识

  1. Container
    容器
    Widget 部件随容器大小改变而移动5
  2. 父容器
    父容器就是用来包含目标元素的容器,相反,子元素就是在目标元素内的,父子是一个相对的概念 比如 <div> <p></p></div>根据上面的代码p元素就是div的子元素
  3. 窗体
    窗体(窗体类主要有QWidget、QDialog、QMainWindow),
  4. Spacers
    分割线
  5. 期望尺寸
    期望尺寸(sizehint)一般为只读
    self.XXXX.pushButton.sizeHint().width()
Toubleshooting

1、执行Pyqt代码报错
在这里插入图片描述
在这里插入图片描述
查了一圈没有用,尝试pip uninstall已经安装的PyQt Package ,然鹅提示没有PyQt5,但是前往该环境下的Lib下查看,却有PyQt5和PyQt4两个文件夹,后面反应过来这个环境是师兄拷给我的,这些package是他之前安装的,但为啥我的Pycharm没有识别出来?直接将文件夹删除之后,重新安装对应版本即解决

C:\hzhsoft\anaconda\envs\env_py37_thk\Lib\site-packages

2、插入网页框架报错

Exception has occurred: ImportError
cannot import name 'QtWebEngineWidgets' from 'PyQt5' (/usr/local/lib/python3.7/site-packages/PyQt5/__init__.py)

查了好久才在Stack Overflow上找到一个回答,说是这个模块被PyQt5移除了,需要单独安装。
安装命令为:

 pip install PyQtWebEngine

PyQt软件开发 20210818

container

Container 分组里的GroupBox 组件,其内部组件按网格状布局

在这里插入图片描述

创建和使用资源文件

1、“File”→“New File or Project…”菜单项
2、在这里插入图片描述

给Pycharm添加external tool进行.py文件转换
互斥按钮
界面与逻辑代码分离
  1. 首先利用Qt designer制作好界面
  2. 将界面利用Pyuic生成源码
  3. 新建一个py文件,import刚才的文件,让界面与逻辑代码分离
子问题1.实现文件读入
文件选择

选择文件夹:

QFileDialog.getExistingDirectory(self, “选择文件夹”, “/”)

选择单个文件:

QFileDialog.getOpenFileName(self, “选择文件”, “/”, “All Files ();;Text Files (.txt)”)

选择多个文件:

QtWidgets.QFileDialog.getOpenFileNames(self, “多文件选择”, “/”, “所有文件 ();;文本文件 (.txt)”)

保存文件:

QtWidgets.QFileDialog.getSaveFileName(self, “文件保存”, “/”, “图片文件 (.png);😭.jpeg)”)

读取.mat文件

首先导入scipy的包 from scipy.io import loadmat

然后读取 m = loadmat(“F:/__identity/activity/论文/data/D001.mat”)

更新文件加载状态
 if(filePath is not None):
            text = "数据加载完毕!"
            self.ui.label_File_Con.setText(text)
  • 若未选取,点击取消后程序闪退
读取文件基本信息
读取文件名
pathMixName = fn.split('/')	# 将fn按照/切分,这里fn是指getOpenFileName函数获得的路径
pathx = "/".join(pathMixName[0:len(pathMixName)-1])	# 假设切分后有n部分,将前n-1部分用/重新拼接,就是文件的路径
namex = pathMixName[len(pathMixName)-1]	# 最后一个就是文件名
字典遍历与字符串匹配

for key in data:

  • 无法计数
            #这里的key为何没有自加
            # num=0
            # i=0
            # strkey = ''
            # for key in data:
            #     strkey = 'Frame' + str(i)
            #     print(strkey)
            #     if(key == strkey):
            #         print(key)
            #         num = num+1
            #         print(num)
            #     i = i + 1
            # print(num)

子问题2.实现数据-》图片

提示:在进行图像处理前一定要弄明白数据的含义,比如我需要输入的.mat文件实际上是一堆温度数据,我却一直把它当作RGB单通道来处理…

获取文本框预设信息

str1= self.lineEdit.text()#从输入框获得用户输入的文本信息,单行显示

str2= self.textEdit.toPlainText()#这个也可以获得用户的输入文本信息,多行显示

数据重组
方式一:plt.imshow
X = figure_new
plt.imshow(X,cmap=plt.cm.hot)
plt.colorbar()  #显示单独的色彩条
plt.axis('off') #不显示坐标轴
plt.show()
方式二: seaborn.heatmap
      fig = plt.figure
      sns.heatmap(figure_new,xticklabels=100,yticklabels=20,cbar_kws={'label': '℃'},cmap="hot")#cbar_kws-色条的标签及其他参数设置,cmap图表主题色彩设置。
        # 处理坐标轴
        plt.xlabel('x', fontsize = 12, color ='k')  # x轴label的文本和字体大小
        plt.ylabel('y', fontsize = 12, color ='k')  # y轴label的文本和字体大小
        plt.xticks(fontsize=12)  # x轴刻度的字体大小(文本包含在pd_data中了)
        plt.yticks(fontsize=12)  # y轴刻度的字体大小(文本包含在pd_data中了)
        plt.show()
子问题3:批量输出高清格式(tif)图片,保存到指定文件夹
plt.imshow(X, cmap=plt.cm.hot)
plt.axis('off')  # 不显示坐标轴
plt.savefig('test.tif')
plt.show() #特别注意。show方法必须放到savefig后面,不然保存的图片是黑的,为什么??
子问题4:各种滤波方式python实现
高斯滤波

数学原理
data[Figframe] = cv2.GaussianBlur(figure_new, (int(Ksize), int(Ksize)), 0)
这个Ksize其实就是所说的窗口大小,一般为奇数。

均值处理
radiobutton信号传递
维纳滤波

scipy.signal.wiener 采用scipy库中的函数

反卷积去运动模糊(待解决)
子问题5:温度梯度分析

使用np.polyfit拟合得多项式系数,np.polyld得到多项式
z1 = np.polyfit(xxx, yyy, 7) # 用7次多项式拟合,可改变多项式阶数,得到系数;
p1 = np.poly1d(z1) #得到多项式,按照阶数从高到低排列
print(p1) #显示多项式

numpy.shape

数组维度为1时,.shape会省略掉1

python给矩阵的某(几)行或者某(几)列赋值

使用range构造列表

//输入
a=range(5)
print(list(a))
//输出
[0, 1, 2, 3, 4]
绘制折线图

改变坐标刻度范围:

plt.xlim(-0.5,11)
#把x轴的刻度范围设置为-0.5到11,
plt.ylim(-5,110)
#把y轴的刻度范围设置为-5到110,
在不同窗口同时展示图像

在每次绘制前分别定义 plt.figure()然后plt.show()
要注意,plt.figure后面有括号,不然不起作用

缺陷区域提示
python 矩阵元素条件索引

b = np.argwhere(a == 1)

查bug

在这里插入图片描述
这样才能够查看报错的详细信息

创造空数组
  DisBestAnaFrameArray = np.full((a[0],a[1]),np.nan)
合并矩阵

https://www.cnblogs.com/itdyb/p/5735911.html
如果是多个(>=2)个numpy数组一起合并也非常简单, 只需要通通放到一个列表中即可,但是必须要保证每个numpy数组在合并的方向上的维度是一致的,否则会报错
在这里插入图片描述
如何合并多个Numpy数组 - 易上手操作

子问题6 温度变化展示
获取字符串转为列表

print(f’List of Items in CSV ={s.split(",")}’)

遍历列表
子问题7 :弹出消息框
子问题8:异常处理

异常捕获基础

Pyqt5 QFileDialog窗口关闭时主窗口也关闭

方法:使用Try except抛出异常

如何把异常信息通过弹框形式展现出来
问题合集
windows下QT Creator输不进去汉字的解决办法

打开 QT Creator ,选择工具—>选项—>再选择左侧的文本编辑器,之后选择右侧的 行为,在选择文件编码,将默认的改为system就行了
在这里插入图片描述

数组索引溢出

在这里插入图片描述

Pycharm输出的报错没有错误代码定位

在这里插入图片描述
勾选图中框内选项

CV2 滤波操作之后矩阵大小

问题描述:在对原始矩阵切片滤波后,发现无法将新的切片赋值给旧切片
在这里插入图片描述
报错之后查看数组形状
在这里插入图片描述
发现了猫腻,原来
x[1,2]的shape值(2,),意思是一维数组,数组中有2个元素
y[[1],[2]]的shape值是(2,1),意思是一个二维数组,每行有1个元素

来自于这篇文章
明显两个数组维度不同,无法赋值;所以考虑将处理后的数组展开
又来看看这篇文章

使用flatten方法将高维数组展开为一维
 y = np.size(BestAnaFrameArray,1)  #列
 for i in range(1,y):
     b = cv2.GaussianBlur(BestAnaFrameArray[:,i], (int(WienerXBest), int(WienerYBest)), 0)
     BestAnaFrameArray[:, i] = np.array(b).flatten()
数组切片操作(很坑!!!)

https://www.cnblogs.com/agnes-mm/p/12723827.html
在这里插入图片描述
根据报错信息回溯原始矩阵

figure_new=figure[int(PreviewUp)-1:int(PreviewDown),int(PreviewLeft)-1:int(PreviewRight)+1] # 注意-1 ,索引从0开始!
程序打包问题!!!
QCoreApplication::exec: The event loop is already running
pyinstaller打包时提示UPX is not available.

https://blog.csdn.net/chentianveiko/article/details/107083912

.exe文件无法执行

cmd一闪而过,且没有显示任何报错信息;在命令行尝试运行也是这样
在这里插入图片描述
尝试降低PyQt5版本pip install PyQt5==5.9

无法引入自己定义的其他py文件

截图发现这里有问题
在这里插入图片描述
关掉pycharm科学运行后发现这里还有问题

QWindowsWindow::setGeometry: Unable to set geometry 920x700+2259+93 on QWidgetWindow/‘MainWindowWindow’

在这里插入图片描述给对应widget 加一个setMinimumSize就好了

这之后就有报错信息了,原来之前是由于窗口问题导致程序一开始就出错

显示不出报错信息就很麻烦

2、cd到你的exe文件目录 3、输入 .***.exe
在这里插入图片描述

找到问题:ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败。(最终方案:scipy降版本)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
S
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本来的想法是手动import这几个缺失的文件
CSDN上有一篇和我情况类似的贴子
然鹅我发现我的scipy下根本没有这个extra-ddl文件,所以降低scipy版本,安装为1.1
按照上文方法把extra-ddl中的库移植打包目录下,程序可以运行!!!虽然疯狂报错
在这里插入图片描述
当然,显示还有些ddl没有拷贝进去,在其他电脑上测试后再看)

测试发现即使不拷贝dll文件,程序照样能够在其他电脑运行(没有安装python环境),所以说就是scipy版本过高的锅!!!
当然,程序打包下来有200多兆,还需要继续优化。

------20210829-------
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python PyQt5 是一种开源的 GUI 库,它可以用来快速地构建跨平台的桌面应用程序。Python PyQt5 中含有大量的基础控件和部件,同时也支持自定义控件和部件的开发。Python PyQt5 为开发者提供了更多的开发工具和样式,同时还支持多语言和国际化,可以满足不同国家和地区用户的不同需求。 在使用 Python PyQt5 开源项目时,开发者可以从各种开源的代码库中获取所需要的代码和组件,并进行二次开发和优化。同时,开源社区也为开发者提供了丰富的文档资料和技术支持,让开发者更加便捷地使用 Python PyQt5 进行开发。 Python PyQt5 可以应用于各种领域的桌面应用程序的开发,例如企业管理系统、教育软件、远程协作工具等。同时,因为使用了 Python 编程语言,Python PyQt5 的开发门槛不高,许多新手也可以很快上手并开发出自己的应用程序。 总而言之,Python PyQt5 是一种非常实用的开源 GUI 库,它为开发者提供了更多的工具和资源,让开发者可以更加高效地构建出跨平台的桌面应用程序,推动了整个开源社区的发展和进步。 ### 回答2: Python是一种易于学习的编程语言,而PyQt5则是Python语言下的一种GUI开发工具。作为开源项目PyQt5具有众多优点,比如它可以在多个平台运行。同时,PyQt5提供了丰富的API库,让开发人员能够在GUI程序中添加各种控件,同时还可以设置控件的属性和事件。PyQt5支持多种GUI工具包,比如Qt Designer,这使得开发者可以快速创建自定义的GUI界面。另外,PyQt5还具有强大的数据处理功能,并支持多线程应用,在处理并发请求时表现出色。因此,PyQt5被广泛用于开发桌面应用程序,包括游戏、办公软件图像处理和数据可视化等领域。开发者可以利用PyQt5的强大功能,创建出卓越的GUI应用,同时可以借助开源社区的力量,拓宽自己的开发技能,提高开发效率。总之,Python Pyqt5是一个非常适合初学者和有经验的开发人员的开源项目,它通过提供丰富的功能和灵活的工具链,帮助开发者构建出高质量的GUI应用程序。 ### 回答3: Python PyQt5 是一种基于 Python 语言和 Qt 库的开源框架。它具有跨平台的特性,可以在 Windows、Linux、MacOS 等操作系统上运行。通过 PyQt5 可以快速开发图形用户界面(GUI)应用程序,支持多种布局方式、窗口控件、事件处理和信号槽机制等。 在开源项目方面,PyQt5 提供了大量的示例代码和文档,可以帮助开发者快速掌握框架的使用方法和技巧。例如,PyQt5 Examples 是一个包含多个示例的项目,其中包括了不同样式、功能和布局的 GUI 程序。另外,在 Github 上也有很多基于 PyQt5 的优秀开源项目,如 GNS3、pyinfra 和 Comix 等,这些项目可以在开发者的实践中提供借鉴和参考价值。 与 PyGTK 和 wxPython 相比,PyQt5 的开发效率更高、代码更简洁,支持的平台也更广泛。同时,基于 Qt 框架的优点也使得 PyQt5 具有良好的稳定性和兼容性。因此,对于需要快速、高效开发 GUI 程序的开发者来说,PyQt5 是一个非常优秀的开源项目
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值