1.首先用Qt Creator 创建一个.ui文件,Qt Creator 是可视化的。
如图,界面布局完成后点击文件选项卡中的保存。
2.进入到.ui文件所在的文件夹
在地址栏输入cmd进入命令窗口。
输入转换代码
pyuic5 -o [转换后的文件名].py [想转换的文件名].ui
这时候回到原来文件夹目录中
.ui文件成功转化成了Python文件,成了被封装好的一个窗口类。
3.新建一个Python文件输入以下代码
# coding = utf-8
from locationui import Ui_MainWindow # 这个是在上文中生成的界面Python文件
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtWidgets
class window(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(window, self).__init__()
self.setupUi(self) #实例化后可以直接在windows类中直接定义事件操作
if __name__ == "__main__":
app = QApplication(sys.argv) # 创建一个应用
window = window() # 实例化窗口
window.show() # 窗口展示
sys.exit(app.exec_()) # 退出关闭应用
运行后效果:
做到这一步,恭喜你完成的流程走下来了!接下来就是熟悉控件以及事件操作了!
使用Graphics View之前需要安装opencv3,使用cv2.imread()函数导入图像,需要进行颜色通道的转换.
pip install opencv-python
在Graphics View显示图片基础代码如下(’‘1.jpg’'换成想换的图片路径)
jpg = QPixmap("1.jpg").scaled(self.maps.width() - 6, self.maps.height() - 6)
self.item = QGraphicsPixmapItem(jpg) # 创建像素图元
self.scene = QGraphicsScene() # 创建场景
self.scene.addItem(self.item) # 添加图元到场景中
self.maps.setScene(self.scene) # 添加场景到视图
self.maps.centerOn(0,0) # 设置view的显示中心
1)self.scene = QGraphicsScene() 也可以如下操作
self.scene = QGraphicsScene(float,float ,float ,float) 直接限定了场景的左上角坐标以及场景矩形框的长和宽,也可以用Qrect 来代替这四个数
QRect,相当于QPoint+QSize
2)最后一行代码是为了场景大于视图的时候能控制滚动条,让视图切到以场景中坐标为(x,y)的中心的显示效果,(0,0)显示的是左上角。这里就不截图了。
难点:
GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景)、QGraphicsView(视图)、QGraphicsItem(图元)。QGraphicsScene本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显示及与外界进行交互,主要提供图元的操作接口、传递事件和管理各个图元状态,提供无变换的绘制功能(如打印);QGraphicsView提供一个可视的窗口,用于显示场景中的图元,一个场景中可以有多个视图。
坐标轴:场景坐标轴,视图坐标轴,图元坐标轴
获得场景坐标
print(self.scene.sceneRect().x())
print(self.scene.sceneRect().y()) # 可供调试
获得图元坐标
print(self.item.pos().x())
print(self.item.pos().y())
图元创建
常见的图元:
QGraphicsSimpleTextItem:提供了一个简单的文本标签项
QGraphicsTextItem:提供了一个格式化的文本项
QGraphicsLineItem:提供了一个直线项
QGraphicsPixmapItem:提供了一个图像项
QGraphicsRectItem:提供了一个矩形项
QGraphicsEllipseItem:提供了一个椭圆项
QGraphicsPathItem:提供了一个路径项
QGraphicsPolygonItem:提供了一个多边形项
QGraphicsSvgItem :提供了svg格式加载项
以椭圆为例
self.item1 = QGraphicsEllipseItem(0,0,10,100) # 创建像素图元 10是长轴 100是短轴 两个参数相同时为圆
self.item1.setPos(100,100) # 设置在场景中的位置
self.scene.addItem(self.item1) # 添加到场景中
self.item1 = QGraphicsEllipseItem(0,0,10,100)
self.pen = QPen() # 描边设置
self.pen.setWidth(1) # 粗细
self.pen.setColor(QColor(qrand() % 256, qrand() % 256, qrand() % 256)) # 随机应用色彩
self.item1.setPen(self.pen) # 应用到图元中
self.item1.setPos(100,100) # 设置在场景中的位置
self.item1.setBrush(QColor(130,10,100)) # 固定上色 也可以用 QColor(qrand() % 256, qrand() % 256, qrand() % 256) 进行随机上色
self.scene.addItem(self.item1)
效果如下:
到这里我们就知道如何创建、设置并显示简单的图元了!
Label是pyqt中最常见的显示控件,它的用途十分广泛
label.text() # 获取label内容
label.setText() # 设置label中的内容
label.linkHovered.connect(self.link_hovered)#针对链接光标略过
label.linkActivated.connect(self.link_clicked)#针对链接点击事件
再配上对应的槽函数便完成了一个事件
使用label控件显示图片
jpg = QPixmap("cat.png").scaled(self.outputm.width(), self.outputm.height())
self.outputm.setPixmap(jpg)
(其中QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,通常是标签或者按钮,用于在标签或按钮上显示图像
QPixmap可以读取的图像文件类型有BMP,GIF,JPG等)
代码中’‘cat.png’'改成相同目录下所需要的文件名或者绝对路径。
当然也可以直接点击按钮弹出选项框选择
# 对话框可视化操作
imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "","*.jpg;;*.png;;All Files(*)")
jpg = QPixmap(imgName).scaled(self.outputm.width(), self.outputm.height())
self.outputm.setPixmap(jpg)
在Qdesigner设计的时候,我们能发现有菜单栏。下面来说说基本使用:
首先双击输入想输入的名字:
然后保存更新ui文件后将更新添加到py文件中去(记得将Object名字改成自己想要的)。然后在python中添加action代码:
self.database.triggered.connect(self.condabase)
def condabase(self):
# 设定相应的事件
pass
注意:这里虽然也是点击,但是不能用clicked,应用triggered。
为了防止应用程序不被卡死,引入多线程的概念
from PyQt5 import QCore
class WorkThread(QCore.QThread):
trigger = pyqtSignal()
# 括号中可以输入信号的类型 比如:trigger = pyqtSignal(str,str)
# 那么下面self.trigger.emit(c1,c2) 注意c1c2是变量名,而上面的str是数据类型
def run(self):
#这一部分就可以写入想要执行的代码
# 运行完毕或者运行过程中发出信号
self.trigger.emit()
workThread=WorkThread() #实例化一个线程对象
workThread.trigger.connect(self.timeStop1) #链接你执行完这个线程之后的想要触发的 函数的名字
workThread.start() #这个就是启动线程
注意上面的库声明是正确的 但是如果换一个可能会报错:
‘NoneType’ object has no attribute ‘QThread’
在所需要打包的py文件目录中进入terminal,输入
pyinstaller -F [所要打包的文件].py
提前需安装pyinstaller的包,pip就可以了。
在安装的过程中出现一些小问题,下面进行列举,并讲述解决方案
1)AttributeError: ‘str’ object has no attribute ‘items’
原因:setuptools包没有最新,更新到40版本就好
解决方法:重新安装uninstall后再install
2)双击后Failed to execute script XXXXXXX
原因:有些包没有正常导入导致无法运行
解决方法:打开terminal,将dist中的.exe文件拖入terminal中,按下回车运行。运行中会报错:no module named XXXX,然后到相应的python安装目录下进入->Lib->sitepackages(里面是你安装的包),根据报错中所缺失的包将它们复制到.exe文件同级目录下。
3)图片缺失
图片进行相对定位,将图片或者资源文件夹复制到同级目录下
!!!重点来了!!!
当环境中其他无用的包数量很多时会让打出来的包文件很大,除了新建一个容器以外还可以死使用虚拟环境进行安装
安装虚拟环境
pip install pipenv
启用虚拟环境
pipenv install
进入虚拟环境
pipenv shell
安装模块,如果报错说明不用安装。经过测试,os sys csv string不用安装
pip install chardet openpyxl
pip install pyinstaller
开始打包。xxx.py是你的py程序
pyinstaller -F xxx.py