由于项目要求最近在看GUI开发的一些知识,在了解了Python的tkinter库跟QT之后,分别做了一版。其中QT更便于上手,功能更加丰富,开发速度与可维护性都比较好,所以对Python 开发QT做一个长期的学习记录。
本文章包括所用到的组件安装,以及将一个新项目从创立到打包成exe可执行程序的全过程。
QT是跨平台的C++开发库,主要用来开发用户图形界面程序(GUI),当然它的功能不止与此,还可以用来绘制漂亮的界面(包括控件,交互,布局),处理多线程,访问数据库,图像跟音视频的处理,网络通信,文件操作等。
Qt Designer是PyQt程序UI界面的实现工具,Qt Designer工具使用简单,可以通过拖拽和点击完成复杂界面设计,并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。
PyQt5是使用Python语言根据QT设计的为了在Python上使用的,本文使用的是Python3。
PyQt5的类别分为几个模块,包括以下:
请自行安装pycharm并且配置Python
界面介绍
菜单栏 区域:用来新建窗口,保存,提供布局快捷键
拖拽组件 区域 :提供Gui界面开发各种基本控件,如单选框、文本框、按钮等。可以拖动到新创建的主程序界面。(在后续的文章中将介绍各个组件的作用)
控件对象列表 区域 :查看主窗口放置的对象列表。
控件属性更改 区域: 提供对窗口、控件、布局的属性编辑功能。比如修改控件的显示文本、对象名、大小等。下面的编辑控件的信号和槽函数,也可以添加自定义的信号和槽函数。
步骤
1.新建一个空白窗口
2.拖入组件,并调整属性,这里我们用一个简单的例子,只包括一个按钮,一个标签跟两个文本框(输入输出)
3来点击保存/另存为,会生成一个.ui文件,这里我命名为’example_ui’
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'example_ui.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_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(315, 206)
self.layoutWidget = QtWidgets.QWidget(Form)
self.layoutWidget.setGeometry(QtCore.QRect(50, 50, 201, 111))
self.layoutWidget.setObjectName("layoutWidget")
self.formLayout = QtWidgets.QFormLayout(self.layoutWidget)
self.formLayout.setContentsMargins(0, 0, 0, 0)
self.formLayout.setObjectName("formLayout")
self.textBrowser = QtWidgets.QTextBrowser(self.layoutWidget)
self.textBrowser.setObjectName("textBrowser")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.textBrowser)
self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton.setObjectName("pushButton")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.pushButton)
self.textEdit = QtWidgets.QTextEdit(self.layoutWidget)
self.textEdit.setObjectName("textEdit")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.textEdit)
self.label = QtWidgets.QLabel(self.layoutWidget)
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(12)
self.label.setFont(font)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "完成"))
self.label.setText(_translate("Form", "请输入:"))
2.因为生成的代码块只是UI界面的部分,具体的将界面展示以及逻辑串联还需要进一步的工作,为了后续的维护方便,实现逻辑清晰,将页面与业务逻辑相分离,新建一个example_main.py文件,调用example_ui文件
首先保持窗口可执行
# 导入程序运行必须模块
import sys
# PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
# 导入designer工具生成的login模块
from example_ui import Ui_Form
class MyMainForm(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MyMainForm, self).__init__(parent)
self.setupUi(self)
if __name__ == "__main__":
# 固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行
app = QApplication(sys.argv)
# 初始化
myWin = MyMainForm()
# 将窗口控件显示在屏幕上
myWin.show()
# 程序运行,sys.exit方法确保程序完整退出。
sys.exit(app.exec_())
点击运行,效果如下图:
3.此时点击按钮还没有任何反应,再写一个简单的逻辑来点击’完成’按钮时,输出框输出输入的值
加入逻辑:
# 导入程序运行必须模块
import sys
# PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
# 导入designer工具生成的login模块
from example_ui import Ui_Form
class MyMainForm(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MyMainForm, self).__init__(parent)
self.setupUi(self)
#给按钮添加点击事件,调用display函数
self.pushButton.clicked.connect(self.display)
def display(self):
#利用toPllainText()来获取textEdit的输入值
MyInput = self.textEdit.toPlainText()
#利用setText()来对textBrowser控件输出值
self.textBrowser.setText(MyInput)
if __name__ == "__main__":
# 固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行
app = QApplication(sys.argv)
# 初始化
myWin = MyMainForm()
# 将窗口控件显示在屏幕上
myWin.show()
# 程序运行,sys.exit方法确保程序完整退出。
sys.exit(app.exec_())
运行效果如下图:
这样就完成了, 在输出框展示通过按钮点击获取输入框的时间,使用以上知识就可以完成一些简单的功能开发了。
首选安装pyinstaller
执行打包
等待完成后,在相应的目录下就可以看到EXE文件及相关配件信息
.
.exe在dist中
PyInstaller 支持的常用选项
指令 | 作用 |
---|---|
-F,-onefile | 产生单个的可执行文件 |
-D,–onedir | 产生一个目录(包含多个文件)作为可执行程序 |
-a,–ascii | 不包含 Unicode 字符集支持 |
-d,–debug | 产生 debug 版本的可执行文件 |
-w,–windowed,–noconsolc | 指定程序运行时不显示命令行窗口(仅对 Windows 有效) |
-c,–nowindowed,–console | 指定使用命令行窗口运行程序(仅对 Windows 有效) |
-o DIR,–out=DIR | 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件 |
-p DIR,–path=DIR | 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径 |
-n NAME,–name=NAME | 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字 |