欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pyqt5

程序员文章站 2022-05-28 11:07:27
...

Python制作小软件——1. 安装并使用PyQt5进行界面设计

最近想学习利用Python进行GUI的设计,网上找了很多教程与方法,用的最多的是使用PyQt+Python就进行开发,同时利用PyQt做出来的界面也是相对而言较为方便且比较美观。

所以自己在闲暇之余,也学习了使用PyQt5+Python进行图形界面的设计,并开发一款属于自己的小软件。

第一篇博客将主要说明如何利用PyQt5进行界面设计,并转化成.py格式的文件。本文的Python版本是Python3.5,通过Anoconda安装的。


安装PyQt5与Qt Designer

PyQt5

通常只要安装了Anoconda,就会默认装好PyQt5,检验的方法很简单。只需在你的Python里面输入import PyQt5没有报错就可以了。没有的话直接在命令行窗口(Win+R,然后输入cmd)输入pip install PyQt5进行安装即可。(使用国内的源则可用如下的命令:pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple,可参考:pip(国内镜像)快速安装Python库

Qt Designer

Qt Designer是用来设计界面的,可以让用户在极短的时间里创建一个图形化用户界面的图形设计器。利用 Qt Designer,我们可以通过拖拉或点击的方式,在窗口的适当位置上添加一些输入框和按钮等窗口组件构造图形用户界面,并可预览效果。其界面如下:
pyqt5

左侧就是控件,右侧是每个控件中的一些属性,可以进行修改。

通常在我们安装完Anoconda后,只有PyQt5库,点进去没有Qt Designer,具体可以查看Anoconda的路径(例如:C:\Users\用户\Anaconda3\Lib\site-packages\PyQt5)。

所以如果我们想要使用Qt Designer则需要使用pip进行安装(不需要重新装几个G的Qt Creator)。我们需要打开命令行输入如下命令即可:

pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 1

然后我们再去Python库的路径下(D:\Anaconda3\envs\FANUC\Lib\site-packages\pyqt5_tools\Qt\bin),找到pyqt5-tools文件夹,里面就有designer.exe,双击进入即可。

pyqt5


设计自己想要的界面

然后就可以开始设计以及想要的界面了。我的目标是创建一个针对文件转换的小软件,也就是需要有一个输入文件路径,输出文件夹路径,确认以及取消几个按键组成,其最终效果如下:


pyqt5

pyqt5

其制作的方法其实非常简单,将左边的需要的内容一个一个往中间拖动即可,其实不需要排列太整齐,只需要大致的排成下图所示的样子即可:


pyqt5

然后全选,右键,选择Lay outLay out in a Grid就会自动排列整齐。(或者快捷键Ctrl+5


pyqt5

然后你也可以拖动,或者添加一些内容变成你想要的格式。

对于每一个控件,右侧都会有其对应的属性,通过修改里面的内容,就可对控件进行修改,包括文字大小、颜色、背景颜色、对象名称等等。
pyqt5

我们需要注意的是objectName,建议不要用默认的名称,而是修改成按钮的实际作用的英文名称。如果用默认的名称,需要记住左侧每一个元素以及与其对应的名称是什么,这在后面使用Python对其后端进行编程时需要用到。例如上图中所示的就是pushButton_2

在我们设计完成这样一个界面时候,直接将其保存,这样就可以得到一个.ui的文件。但这还不够,因为我们想使用Python进行程序的编写,所以还需要将其转换为.py格式的文件才行。


将.ui的文件转换为.py的文件

我们想修改文件的格式,当然不是仅仅只是将后缀进行修改就可以。而是需要在命令行中输入下述的命令,才可将srs1.0.ui文件转换成srs.py文件,而里面的代码也会变为Python的代码。

pyuic5 -o srs.py srs1.0.ui
  • 1

注意,需要转换的时候需要首先cd到储存srs1.0.ui文件的路径(例如将上面代码中的srs1.0.ui变为D:\Desktop\srs1.0.ui),或者还有一种方法不需要手动输入路径,直接输入上述命令即可。就是我们不用传统方式打开命令行,而是在文件存储的文件夹下打开Windows PowerShell,方式如下图所示:先文件夹形式打开桌面,然后点上面的文件,再选择Windows PowerShell


pyqt5

打开的界面如下所示,然后再输入pyuic5 -o srs.py srs1.0.ui即可转为文件名为srs.py.py文件。
pyqt5


Python制作小软件——2. 实现界面中的退出功能

生成的.py格式的文件

在上一篇博客中:Python制作小软件——1. 安装并使用PyQt5进行界面设计,我们说到生成了界面对应的.py格式的文件,里面的内容如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pyqt5_fanuc.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_TCP(object):
    def setupUi(self, TCP):
        TCP.setObjectName("TCP")
        TCP.resize(1272, 895)
        self.pushButton_2 = QtWidgets.QPushButton(TCP)
        self.pushButton_2.setGeometry(QtCore.QRect(1140, 840, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.button_3 = QtWidgets.QPushButton(TCP)
        self.button_3.setGeometry(QtCore.QRect(10, 550, 227, 28))
        self.button_3.setObjectName("button_3")
        self.textBrowser = QtWidgets.QTextBrowser(TCP)
        self.textBrowser.setGeometry(QtCore.QRect(10, 590, 881, 192))
        self.textBrowser.setObjectName("textBrowser")
        self.widget = QtWidgets.QWidget(TCP)
        self.widget.setGeometry(QtCore.QRect(10, 20, 548, 131))
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label_4 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(14)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 0, 0, 1, 2)
        self.label = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 1, 0, 1, 1)
        self.port = QtWidgets.QLineEdit(self.widget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.port.setFont(font)
        self.port.setObjectName("port")
        self.gridLayout.addWidget(self.port, 1, 3, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 2, 1, 1)
        self.IP = QtWidgets.QLineEdit(self.widget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.IP.setFont(font)
        self.IP.setObjectName("IP")
        self.gridLayout.addWidget(self.IP, 1, 1, 1, 1)
        self.button_1 = QtWidgets.QPushButton(self.widget)
        self.button_1.setObjectName("button_1")
        self.gridLayout.addWidget(self.button_1, 2, 0, 1, 1)
        self.result_1 = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(14)
        self.result_1.setFont(font)
        self.result_1.setText("")
        self.result_1.setObjectName("result_1")
        self.gridLayout.addWidget(self.result_1, 3, 0, 1, 4)
        self.widget1 = QtWidgets.QWidget(TCP)
        self.widget1.setGeometry(QtCore.QRect(10, 180, 1248, 132))
        self.widget1.setObjectName("widget1")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.widget1)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.SQL_host = QtWidgets.QLineEdit(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.SQL_host.setFont(font)
        self.SQL_host.setText("")
        self.SQL_host.setObjectName("SQL_host")
        self.gridLayout_2.addWidget(self.SQL_host, 1, 1, 1, 1)
        self.label_9 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_9.setFont(font)
        self.label_9.setObjectName("label_9")
        self.gridLayout_2.addWidget(self.label_9, 1, 8, 1, 1)
        self.SQL_database = QtWidgets.QLineEdit(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.SQL_database.setFont(font)
        self.SQL_database.setObjectName("SQL_database")
        self.gridLayout_2.addWidget(self.SQL_database, 1, 9, 1, 1)
        self.label_8 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.gridLayout_2.addWidget(self.label_8, 1, 6, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(14)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.gridLayout_2.addWidget(self.label_6, 0, 0, 1, 2)
        self.label_5 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.gridLayout_2.addWidget(self.label_5, 1, 2, 1, 1)
        self.button_2 = QtWidgets.QPushButton(self.widget1)
        self.button_2.setObjectName("button_2")
        self.gridLayout_2.addWidget(self.button_2, 2, 0, 1, 2)
        self.label_3 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.gridLayout_2.addWidget(self.label_3, 1, 0, 1, 1)
        self.SQL_port = QtWidgets.QLineEdit(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.SQL_port.setFont(font)
        self.SQL_port.setObjectName("SQL_port")
        self.gridLayout_2.addWidget(self.SQL_port, 1, 3, 1, 1)
        self.SQL_password = QtWidgets.QLineEdit(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.SQL_password.setFont(font)
        self.SQL_password.setObjectName("SQL_password")
        self.gridLayout_2.addWidget(self.SQL_password, 1, 7, 1, 1)
        self.SQL_user = QtWidgets.QLineEdit(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.SQL_user.setFont(font)
        self.SQL_user.setObjectName("SQL_user")
        self.gridLayout_2.addWidget(self.SQL_user, 1, 5, 1, 1)
        self.label_7 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.gridLayout_2.addWidget(self.label_7, 1, 4, 1, 1)
        self.result_2 = QtWidgets.QLabel(self.widget1)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(14)
        self.result_2.setFont(font)
        self.result_2.setText("")
        self.result_2.setObjectName("result_2")
        self.gridLayout_2.addWidget(self.result_2, 3, 0, 1, 4)
        self.widget2 = QtWidgets.QWidget(TCP)
        self.widget2.setGeometry(QtCore.QRect(11, 350, 876, 189))
        self.widget2.setObjectName("widget2")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.widget2)
        self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.gridLayout_3 = QtWidgets.QGridLayout()
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.label_14 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_14.setFont(font)
        self.label_14.setObjectName("label_14")
        self.gridLayout_3.addWidget(self.label_14, 0, 0, 1, 2)
        self.label_10 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_10.setFont(font)
        self.label_10.setObjectName("label_10")
        self.gridLayout_3.addWidget(self.label_10, 1, 0, 1, 1)
        self.pallet1_x = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet1_x.setFont(font)
        self.pallet1_x.setText("")
        self.pallet1_x.setObjectName("pallet1_x")
        self.gridLayout_3.addWidget(self.pallet1_x, 1, 1, 1, 1)
        self.label_11 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_11.setFont(font)
        self.label_11.setObjectName("label_11")
        self.gridLayout_3.addWidget(self.label_11, 1, 2, 1, 1)
        self.pallet1_y = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet1_y.setFont(font)
        self.pallet1_y.setObjectName("pallet1_y")
        self.gridLayout_3.addWidget(self.pallet1_y, 1, 3, 1, 1)
        self.label_12 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_12.setFont(font)
        self.label_12.setObjectName("label_12")
        self.gridLayout_3.addWidget(self.label_12, 1, 4, 1, 1)
        self.pallet1_z = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet1_z.setFont(font)
        self.pallet1_z.setObjectName("pallet1_z")
        self.gridLayout_3.addWidget(self.pallet1_z, 1, 5, 1, 1)
        self.label_13 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_13.setFont(font)
        self.label_13.setObjectName("label_13")
        self.gridLayout_3.addWidget(self.label_13, 1, 6, 1, 1)
        self.pallet1_rotate = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet1_rotate.setFont(font)
        self.pallet1_rotate.setObjectName("pallet1_rotate")
        self.gridLayout_3.addWidget(self.pallet1_rotate, 1, 7, 1, 1)
        self.label_17 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_17.setFont(font)
        self.label_17.setObjectName("label_17")
        self.gridLayout_3.addWidget(self.label_17, 2, 0, 1, 2)
        self.label_15 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_15.setFont(font)
        self.label_15.setObjectName("label_15")
        self.gridLayout_3.addWidget(self.label_15, 3, 0, 1, 1)
        self.pallet2_x = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet2_x.setFont(font)
        self.pallet2_x.setText("")
        self.pallet2_x.setObjectName("pallet2_x")
        self.gridLayout_3.addWidget(self.pallet2_x, 3, 1, 1, 1)
        self.label_16 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_16.setFont(font)
        self.label_16.setObjectName("label_16")
        self.gridLayout_3.addWidget(self.label_16, 3, 2, 1, 1)
        self.pallet2_y = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet2_y.setFont(font)
        self.pallet2_y.setObjectName("pallet2_y")
        self.gridLayout_3.addWidget(self.pallet2_y, 3, 3, 1, 1)
        self.label_19 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_19.setFont(font)
        self.label_19.setObjectName("label_19")
        self.gridLayout_3.addWidget(self.label_19, 3, 4, 1, 1)
        self.pallet2_z = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet2_z.setFont(font)
        self.pallet2_z.setObjectName("pallet2_z")
        self.gridLayout_3.addWidget(self.pallet2_z, 3, 5, 1, 1)
        self.label_18 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_18.setFont(font)
        self.label_18.setObjectName("label_18")
        self.gridLayout_3.addWidget(self.label_18, 3, 6, 1, 1)
        self.pallet2_rotate = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.pallet2_rotate.setFont(font)
        self.pallet2_rotate.setObjectName("pallet2_rotate")
        self.gridLayout_3.addWidget(self.pallet2_rotate, 3, 7, 1, 1)
        self.gridLayout_4.addLayout(self.gridLayout_3, 0, 0, 1, 6)
        self.label_20 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_20.setFont(font)
        self.label_20.setObjectName("label_20")
        self.gridLayout_4.addWidget(self.label_20, 1, 0, 1, 2)
        self.label_21 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_21.setFont(font)
        self.label_21.setObjectName("label_21")
        self.gridLayout_4.addWidget(self.label_21, 2, 0, 1, 1)
        self.robot_x = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.robot_x.setFont(font)
        self.robot_x.setText("")
        self.robot_x.setObjectName("robot_x")
        self.gridLayout_4.addWidget(self.robot_x, 2, 1, 1, 1)
        self.label_23 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_23.setFont(font)
        self.label_23.setObjectName("label_23")
        self.gridLayout_4.addWidget(self.label_23, 2, 2, 1, 1)
        self.robot_y = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.robot_y.setFont(font)
        self.robot_y.setText("")
        self.robot_y.setObjectName("robot_y")
        self.gridLayout_4.addWidget(self.robot_y, 2, 3, 1, 1)
        self.label_22 = QtWidgets.QLabel(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_22.setFont(font)
        self.label_22.setObjectName("label_22")
        self.gridLayout_4.addWidget(self.label_22, 2, 4, 1, 1)
        self.robot_z = QtWidgets.QLineEdit(self.widget2)
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.robot_z.setFont(font)
        self.robot_z.setText("")
        self.robot_z.setObjectName("robot_z")
        self.gridLayout_4.addWidget(self.robot_z, 2, 5, 1, 1)

        self.retranslateUi(TCP)
        self.pushButton_2.clicked.connect(TCP.close)
        QtCore.QMetaObject.connectSlotsByName(TCP)

    def retranslateUi(self, TCP):
        _translate = QtCore.QCoreApplication.translate
        TCP.setWindowTitle(_translate("TCP", "Dialog"))
        self.pushButton_2.setText(_translate("TCP", "cancel"))
        self.button_3.setText(_translate("TCP", "启动TCP服务器"))
        self.label_4.setText(_translate("TCP", "客户端"))
        self.label.setText(_translate("TCP", "IP"))
        self.label_2.setText(_translate("TCP", "port"))
        self.button_1.setText(_translate("TCP", "测试相机"))
        self.label_9.setText(_translate("TCP", "database"))
        self.label_8.setText(_translate("TCP", "password"))
        self.label_6.setText(_translate("TCP", "服务器"))
        self.label_5.setText(_translate("TCP", "port"))
        self.button_2.setText(_translate("TCP", "测试SQLServer"))
        self.label_3.setText(_translate("TCP", "host"))
        self.label_7.setText(_translate("TCP", "user"))
        self.label_14.setText(_translate("TCP", "托盘(抓取)TCP坐标"))
        self.label_10.setText(_translate("TCP", "x"))
        self.label_11.setText(_translate("TCP", "y"))
        self.label_12.setText(_translate("TCP", "z"))
        self.label_13.setText(_translate("TCP", "rotate"))
        self.label_17.setText(_translate("TCP", "托盘(放置)TCP坐标"))
        self.label_15.setText(_translate("TCP", "x"))
        self.label_16.setText(_translate("TCP", "y"))
        self.label_19.setText(_translate("TCP", "z"))
        self.label_18.setText(_translate("TCP", "rotate"))
        self.label_20.setText(_translate("TCP", "机器人TCP坐标"))
        self.label_21.setText(_translate("TCP", "x"))
        self.label_23.setText(_translate("TCP", "y"))
        self.label_22.setText(_translate("TCP", "z"))

在Python中查看在Qt Designer中设计的界面

我们发现,有了上述的代码,却不能直接运行查看我们刚刚设计出来的界面。这时我们首先将前面的.py文件存到Python的默认路径下,然后再新建一个文件夹,输入如下代码即可运行查看了。

from PyQt5.QtWidgets import *
from pyqt5_fanuc import Ui_TCP



class mywindow(QMainWindow, Ui_TCP):
    def __init__(self):
        super(mywindow, self).__init__()
        self.setupUi(self)
        # self.pushButton_2.clicked.connect(self.write_folder)
        

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    ui = mywindow()
    ui.show()
    sys.exit(app.exec_())

运行之后就会弹出我们前面设计好的界面:


pyqt5

但这时候点击里面所有的按键都没有作用(因为还没写好里面的一些函数,只有一个忽悠人的空架子)。所以下面,我们就要开始丰富上面的那段代码,来实现每个按钮的功能。

在这之前,我们需要先设置Cancel的退出功能,这部分功能其实是在Qt Designer里面就需要设置好的。


设置按钮的退出的功能

首先回到我们的Qt Designer。首先选择上面的Edit Signals/Slots,如下图所示。这个叫做“槽”,很多博客对其有着详细的描述,这里我们只是简单的进行使用。


pyqt5

然后按着Cancel按钮,移动鼠标,就会弹出下面的框框出来:


pyqt5

这里我们选择下面clicked()然后将下面的显示所有内容那里打上勾,然后再选择右边的close(),即可完成操作。


pyqt5

完成之后的界面长下面这样:


pyqt5

然后进行保存即可。之后记得再将.ui文件转换为.py文件。

这一部分对应的原始文件中代码是:

self.pushButton_3.clicked.connect(SRS.close)
  • 1

这时,我们就可以再在Python运行主体函数,在弹出我们所需的界面后,点击Cancel发现可以直接关闭窗口了。

到这里,界面对应的代码基本就不需要再做改动了,后面的内部实现功能直接照着.py文件(例子中是srs.py)中的对象名称进行设计即可

Python制作小软件——3. 利用PyQt5实现界面中的功能

from PyQt5.QtWidgets import *
from pyqt5_fanuc import Ui_TCP



class mywindow(QMainWindow, Ui_TCP):
    def __init__(self):
        super(mywindow, self).__init__()
        self.setupUi(self)
        # self.pushButton_2.clicked.connect(self.write_folder)
        self.button_1.clicked.connect(self.TestConnect)
        self.button_2.clicked.connect(self.TestSQL)
        self.button_3.clicked.connect(self.run_server)
        self.IP.setText('127.0.0.1')
        self.port.setText('9998')
        self.SQL_host.setText('127.0.0.1')
        self.SQL_port.setText('1433')
        self.SQL_user.setText('sa')
        self.SQL_password.setText('Passw0rd')
        self.SQL_database.setText("robot")
        self.pallet1_x.setText('800')
        self.pallet1_y.setText('-561')
        self.pallet1_z.setText('117')
        self.pallet1_rotate.setText('90')
        self.pallet2_x.setText('-526')
        self.pallet2_y.setText('1110')
        self.pallet2_z.setText('95')
        self.pallet2_rotate.setText('0')
        self.robot_x.setText('0')
        self.robot_y.setText('0')
        self.robot_z.setText('670')

        # self.pushButton_ok.clicked.connect(self.process)

    def TestConnect(self):
        # 选取文件

        IP = self.IP.text()
        port = self.port.text()
        print(IP + ":" + port)
        client = socket.socket()  # 创建一个客户端
        # print("www")
        try:
            client.connect((str(IP), int(port)))  # 连接服务端

            self.result_1.setText(r'连接相机成功!')
        except ConnectionRefusedError as e:
            # print("端口{}未开放。".format(i+sp))

            self.result_1.setText(r'连接相机失败!')

    def TestSQL(self):
        host = self.SQL_host.text()
        port = self.SQL_port.text()
        user = self.SQL_user.text()
        password = self.SQL_password.text()
        database = self.SQL_database.text()

        conn = pymssql.connect(host=host, port=port, user=user, password=password, database=database)

        # conn = pymssql.connect(host='127.0.0.1',  port='1433', user='sa',password='Passw0rd', database='robot')
        try:
            cursor = conn.cursor()
            if cursor:
                self.result_2.setText(r"连接SQLServer成功!")
        except:
            # print("端口{}未开放。".format(i+sp))

            self.result_2.setText(r'连接SQLServer失败!')

    def run_server(self):
        pallet1 = [int(self.pallet1_x.text()), int(self.pallet1_y.text()), int(self.pallet1_z.text()),
                   int(self.pallet1_rotate.text())]
        pallet2 = [int(self.pallet2_x.text()), int(self.pallet2_y.text()), int(self.pallet2_z.text()),
                   int(self.pallet2_rotate.text())]
        TCP = [int(self.robot_x.text()), int(self.robot_y.text()), int(self.robot_z.text())]
        dict = {
            'IP': str(self.IP.text()),
            "port": int(self.port.text()),
            'SQL_user': self.SQL_user.text(),
            "SQL_password": self.SQL_password.text(),
            "SQL_host": self.SQL_host.text(),
            "SQL_port": self.SQL_port.text(),
            "SQL_database": self.SQL_database.text(),
            "pallet1": pallet1,
            "pallet2": pallet2,
            "TCP": TCP

        }
        
        self.textBrowser.append('服务器已启动')
        self.textBrowser.moveCursor(self.textBrowser.textCursor().End)  #转至最低消息
        QApplication.processEvents()  #刷新界面
        TCP_Server.create(dict).start_server()

if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    ui = mywindow()
    ui.show()
    sys.exit(app.exec_())

Python制作小软件——4. 利用PyInstaller打包成exe文件

在前面:Python制作小软件——3. 利用PyQt5实现界面中的功能,介绍完了Python中如何呼唤出我们的界面后

最后最重要的就是将我们做好的东西,全部打包成一个.exe可执行文件。这里我们使用的是PyInstaller进行封装。(查找过许多方法,但是最后还是选择了相对而言最便捷的方法进行封装)


安装PyInstaller

我们还是使用pip进行安装:

pip install PyInstaller
  • 1

安装完成后,直接打开命令行,输入pyinstaller,如果显示如下界面,说明安装成功。

pyqt5

然后就可以进行我们小程序的封装了。


初次尝试封装

首先将我们.ui文件转化来的.py文件储存在Python的默认路径,然后打开命令行,cd到我们的server.py文件所在的路径,接着再输入如下命令即可完成.exe可执行文件的封装。

pyinstaller -F -w server.py
  • 1

这里解释一下-F-w的含义:

  • -F:将所有内容全部打包成一个exe可执行文件,而不会有其它的一些奇奇怪怪的小依赖文件。
  • -w:运行生成的exe文件时,不会弹出命令行窗口,而是直接弹出我们做的GUI。

运行完之后,桌面上就会弹出一个dist文件夹,然后里面就是一个exe文件了。这时双击。。。

![这里写图片描述](https://img-blog.csdn.net/20180807181908993?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTkyOTUyNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

可怕的事情发生了!发现报错!

然后费劲心思上网搜索原因是因为少了一些依赖,解决方法很简单,只需要找到我们PyQt5库的安装路径,在里面找到plugins\platforms文件夹就好了,然后复制到生成的exe可执行文件旁边就能打开了。

但问题来了:我的PyQt5安装路径是:C:\Users\Kanny\Anaconda3\Lib\site-packages\PyQt5里面根本没有所说的plugins文件夹,这就很尴尬了。(有评论小伙伴说C:\Users\Kanny\Anaconda3\Lib\site-packages\PyQt5\Qt\plugins中找到了相应的文件,可直接进行安装)

但是不方,我在C:\Users\Kanny\Anaconda3\Lib\site-packages\pyqt5-tools里面找到了platforms,然后将它像下图所示,安排的明明白白的(简直被我的机智所吓到):

![这里写图片描述](https://img-blog.csdn.net/20180807182641890?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTkyOTUyNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

双击运行,发现:还!是!报!错!

此时万念俱灭的我决定,再尝试搞出一个有plugins\platforms的PyQt5库出来,这时候就需要我们重新安装下PyQt5,我装的版本是PyQt5-5.6-gpl-Py3.5-Qt5.6.0-x64-2,网上搜的到,50多m,然后双击安装它,使用默认路径,会自动覆盖原本的PyQt5(注意将原本的一切与PyQt5有关的程序都关掉再进行安装,包括Python)。下面放上安装包:

PyQt5安装包:链接:https://pan.baidu.com/s/1L056oXu6Jl_vAj23rSVW_Q 密码:4i21


再次尝试封装

安装完新的PyQt5就开始跃跃欲试了,首先再看看我们PyQt5目录下有什么了:

pyqt5

发现出现了plugins文件夹里面有platforms

然后重新封装一次exe文件,再将platforms文件夹完整的拷贝到我们的exe文件旁边,然后双击:

![这里写图片描述](https://img-blog.csdn.net/20180807183725160?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTkyOTUyNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

大功告成!

但是旁边的文件大小211m是怎么回事?说好的软件呢?

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                            </div>
相关标签: pyqt5 pyqt