目录
Qt学习(5.14.2)
基础知识
-
- 类
类的实质是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型,不同的是它是一种复杂的数据类型。因为它的本质是数据类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。
- 2.GUI
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面
- 3.4.14——QT
qt creator更改完ui文件后,执行.py主程序发现界面没有更改。 -
检查发现没有编译更新ui——py文件,>查看uic.bat文件,路径无误。
-
检查pyuic5.exe是否安装成功
采用cmd方式输入
初步判断文件名 software hzh中有空格???
- sys模块主要是针对与Python解释器相关的变量和方法,不是主机操作系统。
- 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位小数
基础知识
- Container
容器
Widget 部件随容器大小改变而移动5 - 父容器
父容器就是用来包含目标元素的容器,相反,子元素就是在目标元素内的,父子是一个相对的概念 比如<div> <p></p></div>
根据上面的代码p元素就是div的子元素 - 窗体
窗体(窗体类主要有QWidget、QDialog、QMainWindow), - Spacers
分割线 - 期望尺寸
期望尺寸(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文件转换
互斥按钮
界面与逻辑代码分离
- 首先利用Qt designer制作好界面
- 将界面利用Pyuic生成源码
- 新建一个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降版本)
本来的想法是手动import这几个缺失的文件
CSDN上有一篇和我情况类似的贴子
然鹅我发现我的scipy下根本没有这个extra-ddl文件,所以降低scipy版本,安装为1.1
按照上文方法把extra-ddl中的库移植打包目录下,程序可以运行!!!虽然疯狂报错
当然,显示还有些ddl没有拷贝进去,在其他电脑上测试后再看)
测试发现即使不拷贝dll文件,程序照样能够在其他电脑运行(没有安装python环境),所以说就是scipy版本过高的锅!!!
当然,程序打包下来有200多兆,还需要继续优化。