1安装
1安装python3
激活环境conda 环境创建一个py3环境,如果是其他环境例如树莓派或者jetson就不用了直接装,(把python且换到python3)
activate py37_tfgpu1131_keras215_opencv341
创建python3.8环境
conda create -n py38 python=3.8
同意 y

激活
activate py38
更新源
python -m pip install --upgrade pip
python -m pip install --upgrade pip -i https://pypi.douban.com/simple --user
安装pyqt5
pip install PyQt5 -i https://pypi.douban.com/simple
pip3 install pyqt5==5.12.0 -i https://pypi.douban.com/simple (现在5.15.2)
如果pyqt5后面没有指定版本,将安装最新版本5.14.1,但是这个版本太新,出现兼容性问题,缺少libqsqlmysql.so,不支持连接mysql数据库,而5.12.0则可支持mysql。
pip3 install PyQt5-tools -i https://pypi.douban.com/simple
测试
designer
安装数据库
pip install pymysql -i https://pypi.douban.com/simple
=======================================================================
1 首先更新pip3:
sudo python3 -m pip install --upgrade pip
2 安装pyqt5
sudo pip3 install pyqt5==5.12.0 (现在5.15.2)
如果pyqt5后面没有指定版本,将安装最新版本5.14.1,但是这个版本太新,出现兼容性问题,缺少libqsqlmysql.so,不支持连接mysql数据库,而5.12.0则可支持mysql。
3 安装图形设计工具
sudo apt install pyqt5* #安装pyqt5的依赖项
sudo apt install qt5-default qttools5-dev-tools # 安装qtdesigner
4 安装webview 需要单独安装,如果要用
pip3 install PyQtWebEngine==5.12.0
报错

https://blog.csdn.net/zhanghm1995/article/details/106474505
2使用
1测试
创建文件,在激活环境中运行
python 1pyqt_simple.py

import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
#创建一个应用对象
app = QApplication(sys.argv)#sys.argv是一组命令行参数的列表
w = QWidget()
w.resize(250, 150)
w.move(300, 300)#控件放置到屏幕坐标的(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角。
w.setWindowTitle('Simple')#窗口添加了一个标题
w.show()#控件在桌面上显示出来
'''
我们进入了应用的主循环中,事件处理器这个时候开始工作。
主循环从窗口上接收事件,并把事件传入到派发到应用控件里。
当调用exit()方法或直接销毁主控件时,主循环就会结束。
sys.exit()方法能确保主循环安全退出。外部环境能通知主控件怎么结束。
'''
sys.exit(app.exec_())
类得封装
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
#一个是这个类本身的,一个是这个类继承
class Example(QWidget):
def __init__(self):
super().__init__()
#初始化
self.initUI()
def initUI(self):
#1参数分别代表屏幕坐标的x、y和窗口大小的宽、高。
self.setGeometry(300, 300, 300, 220)
#2标题
self.setWindowTitle('这是一个测试')
#3小图片
self.setWindowIcon(QIcon('web.png'))
#窗口显示
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
更多的使用
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
#一个是这个类本身的,一个是这个类继承
class Example(QWidget):
def __init__(self):
super().__init__()
#初始化
self.initUI()
def initUI(self):
self.resize(250, 150)
self.center()
#创建了一个提示框 10px的SansSerif字体
QToolTip.setFont(QFont('SansSerif', 10))
#带提示框按钮
btn = QPushButton('测试按钮', self)#创建按钮
btn.setToolTip('This is a <b>QPushButton</b> widget')#提示框
btn.resize(btn.sizeHint())
btn.move(50, 50)
#退出按钮
qbtn = QPushButton('Quit', self)
qbtn.clicked.connect(QCoreApplication.instance().quit)
qbtn.resize(qbtn.sizeHint())
qbtn.move(100, 50)
#1参数分别代表屏幕坐标的x、y和窗口大小的宽、高。
#self.setGeometry(300, 300, 300, 220)
#2标题
self.setWindowTitle('这是一个测试')
#3小图片
self.setWindowIcon(QIcon('web.png'))
#窗口显示
self.show()
def center(self):
qr = self.frameGeometry()#获得主窗口所在的框架
cp = QDesktopWidget().availableGeometry().center()#获取显示器的分辨率,然后得到屏幕中间点的位置。
print(QDesktopWidget().availableGeometry())
qr.moveCenter(cp)#然后把主窗口框架的中心点放置到屏幕的中心位置。
self.move(qr.topLeft())#然后通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了。
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
2使用图形化设计器创建界面
激活环境 运行
designer

在界面上创建几个按钮和一个lable
默认布局是窗口变大控件保持原大小并且相对位置不变,如需要改变,例如栅格布局
在主窗体空白处右键-布局-栅格布局


最后删除掉自带菜单和不用的控件,简化


保存文件

生成的是ui文件不能直被python用,需要转化
命令行打开designer和转换.ui文件到py
执行

python -m PyQt5.uic.pyuic .\输入名字.ui -o .\输出名字.py python -m PyQt5.uic.pyuic .\UI_1test.ui -o .\UI_1test.py

打开转化后的文件

参考示意图理解界面文件
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '.\UI_1test.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
#主窗体初始化设置
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
#获取主窗体引用
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
#添加布局
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
#添加label
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 2) # 第0行第0列 占用一行 2列
#添加按钮1
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1)# 第1行第0列 占用一行 1列
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
#添加按钮2
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout.addWidget(self.pushButton_2, 1, 1, 1, 1)# 第1行第1列 占用一行 1列
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "TextLabel"))
self.pushButton.setText(_translate("MainWindow", "开始"))
self.pushButton_2.setText(_translate("MainWindow", "清空"))
调用

0引用类
#导入类 from UI_1test import *
1类继承我们的gui界面 Ui_MainWindow
class Example(QMainWindow,Ui_MainWindow):
2初始化函数注意修改名
Ui_MainWindow.__init__(self)

import sys
from PyQt5.QtWidgets import QApplication, QWidget,QMainWindow
from PyQt5.QtGui import QIcon
#导入类
from UI_1test import *
#一个是这个类本身的,一个是这个类继承
class Example(QMainWindow,Ui_MainWindow):
def __init__(self):
#QMainWindow.__init__(self)
#Ui_MainWindow.__init__(self)
super(Example, self).__init__()
self.setupUi(self)
#增加按键函数原GUI每次生成会被覆盖
self.pushButton.clicked.connect(self.helloworld)
#按键对应出发函数
def helloworld(self):#label上显示文字hello world
self.label.setText("hello world")
if __name__ == '__main__':
app = QApplication(sys.argv)
ui=Example()
ui.show()
sys.exit(app.exec_())
运行

点按钮修改名字

样例1 代码画图
有时需要加入一些图标,如果不需要用界面托抓是生成界面
直接代码生成

from PyQt5.QtWidgets import QPushButton,QWidget,QApplication,QGridLayout,QListWidget,QLineEdit
import pyqtgraph as pg
import sys
import numpy as np
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
self.linePlot()
self.scatterPlot()
self.three_curves()
def initUI(self):
self.setGeometry(400,400,800,620)
self.setWindowTitle("pyqtgraph快速入门")
## 创建一些小部件放在顶级窗口中
btn = QPushButton('press me')
text = QLineEdit('enter text')
listw = QListWidget()
listw.addItems(["aa", "bb", "cc"])
self.gridLayout = QGridLayout(self)
## 将部件添加到布局中的适当位置
self.gridLayout.addWidget(btn, 0, 0)
self.gridLayout.addWidget(text, 1, 0)
self.gridLayout.addWidget(listw, 2, 0)
self.setLayout(self.gridLayout)
def linePlot(self):
plt1 = pg.PlotWidget()
plt1.plot([i for i in range(10)], [i * i for i in range(10)])
self.gridLayout.addWidget(plt1, 0, 1, 1, 1)
def scatterPlot(self):
plt2 = pg.PlotWidget()
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
plt2.plot(x, y, pen=None, symbol="o")
self.gridLayout.addWidget(plt2, 1, 1, 1, 1)
def three_curves(self):
plt3 = pg.PlotWidget(title="Three plot curves")
x = np.arange(1000)
y = np.random.normal(size=(3, 1000))
for i in range(3):
plt3.plot(x, y[i], pen=(i, 3)) ## setting pen=(i,3) 自动创建3个不同颜色的笔
self.gridLayout.addWidget(plt3, 2, 1, 1, 1)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
样例2 在图形化界面插入画图
布局技巧
1首先使用水平布局和垂直布局设计好每一块

2-1 如果需要每一块大小固定直接窗口调整就行了
2-2 如果需要整体随窗口变化变化,最后整体使用栅格布局
缺点:如果图片是变动的,会导致整个布局乱了

3在原始界面加入本身不存在的控件
画图本身在QT里面没有,临时创建一个水平或者垂直容器,直接在里面加入

在引用的时候

保存后 转化文件
python -m PyQt5.uic.pyuic .\UI_1test.ui -o .\UI_1test.py
生成的UI

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '.\UI_1test.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(888, 855)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 10, 821, 461))
self.label.setObjectName("label")
self.formLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.formLayoutWidget.setGeometry(QtCore.QRect(690, 490, 161, 331))
self.formLayoutWidget.setObjectName("formLayoutWidget")
self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
self.formLayout.setLabelAlignment(QtCore.Qt.AlignCenter)
self.formLayout.setFormAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
self.formLayout.setContentsMargins(0, 0, 0, 0)
self.formLayout.setObjectName("formLayout")
self.pushButton_1 = QtWidgets.QPushButton(self.formLayoutWidget)
self.pushButton_1.setObjectName("pushButton_1")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.pushButton_1)
self.pushButton_2 = QtWidgets.QPushButton(self.formLayoutWidget)
self.pushButton_2.setObjectName("pushButton_2")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.pushButton_2)
self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(30, 490, 651, 331))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout_2.addWidget(self.pushButton)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "图片窗口"))
self.pushButton_1.setText(_translate("MainWindow", "开始"))
self.pushButton_2.setText(_translate("MainWindow", "清空"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
调用文件
import sys
from PyQt5.QtWidgets import QApplication, QWidget,QMainWindow
from PyQt5.QtGui import QIcon
import pyqtgraph as pg
import numpy as np
#导入类
from UI_1test import *
#一个是这个类本身的,一个是这个类继承
class Example(QMainWindow,Ui_MainWindow):
def __init__(self):
#QMainWindow.__init__(self)
#Ui_MainWindow.__init__(self)
super(Example, self).__init__()
self.setupUi(self)
#自己增加初始化
self.Int_UI()
#自己增加按钮事件
self.pushButton_1.clicked.connect(self.helloworld)
#按键对应出发函数
def helloworld(self):#label上显示文字hello world
self.label.setText("hello world")
#读取txt 赋予数组
self.x = np.arange(1000)
self.y = np.random.normal(size=1000)
self.plt1.plot(self.x, self.y, pen=(1, 3))
def Int_UI(self):
#初始化创建表格
self.plt1 = pg.PlotWidget(title="Three plot curves")
self.verticalLayout_2.addWidget(self.plt1)
if __name__ == '__main__':
app = QApplication(sys.argv)
ui=Example()
ui.show()
sys.exit(app.exec_())
浙公网安备 33010602011771号