• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
pyqt5开发(1)部署环境aconda安装

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_())

  

posted on 2020-11-12 16:17  MKT-porter  阅读(460)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3