在前一章节我们已经将前端页面设计好并转换成py代码了,(具体可见上一篇用python制作的软件2-qt前端页面设计)
接下来主要讲一下前后端的交互,以及打包。
先捋一下思路
:
我主要是建了3个py文件。
第一个是ui.py,即我们在前一章设计的前端页面转换的文件,所有前端的设置、功能等都在这里
第二个是token.py,这是我的主进程要用的方法,这个文件的目的只有一个,就是接收前端传来的参数,再把转换的token return出来,后端处理主要的逻辑都在这里
第三个是main.py,我在这个文件里创建程序对象,继承界面,处理主进程,没有过多的逻辑,目的就是调用
详细讲一下各个文件
第二个文件
第二个文件token.py涉及到公司的一些逻辑,恕不能详讲,我这里就是定义了一个方法来接收前端输入的值,对合法性判断,再通过处理最后返回处理结果。
第三个文件
第三个文件main.py首先是定义一个类,来继承前端的界面类。继承以后,需要初始化。需要先把第一个文件导进来
from PyQt5 import QtWidgets # 调用界面用到的库
from ui import Ui_MainWindow # 界面
class mywindow(QtWidgets.QWidget, Ui_MainWindow): # 继承 Ui_MainWindow界面类
def __init__(self):
super(mywindow, self).__init__() # 初始化父类
self.setupUi(self) # 继承 Ui_MainWindow 基础类
self.retranslateUi(self) # 继承 Ui_MainWindow 界面类
主进程是由第二个文件处理的,导完包可以直接调用。
# 主进程处理
def tokenprocess(self):
self.textEdit.setText(token( self.lineEdit.text()))
这段代码定义主进程方法,待会在前端代码里等用户输入完成,点击查询时即调用。
传入token方法的参数是通过lineEdit(输入框的)的text()方法拿到的。
前面第二章节页面设计的时候,还做了一个复制按钮,就是想在查出来token时,用户点击一下复制,即将查询结果复制在系统的粘贴板,用户可以直接使用,
import sys
# 复制到粘贴板功能
def copyText(self):
clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(self.textEdit.toPlainText()) #把结果复制到粘贴板
textEdit是第二节的输入框对象,用toPlainText()方法实现获取文本框里面的内容
以下是第三个文件完整代码
import sys
from tokenUIV2 import Ui_MainWindow # 界面
from xxxToken import token #接口获取token
from PyQt5 import QtWidgets # 调用界面用到的库
class mywindow(QtWidgets.QWidget, Ui_MainWindow): # 继承 Ui_MainWindow界面类
def __init__(self):
super(mywindow, self).__init__() # 初始化父类
self.setupUi(self) # 继承 Ui_MainWindow 基础类
self.retranslateUi(self) # 继承 Ui_MainWindow 界面类
# 主进程处理
def tokenprocess(self):
self.textEdit.setText(token( self.lineEdit.text()))
# 复制到粘贴板功能
def copyText(self):
clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(self.textEdit.toPlainText()) #把结果复制到粘贴板
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv) # 创建应用程序对象
ui = mywindow()
ui.show()
sys.exit(app.exec_())
第一个文件
最后再来处理一下第一个文件ui.py
1.在第一个文件的setupUi方法里可以看到之前我们写的关闭和清空功能,程序帮我们自动生成了两行代码
self.pushButton_4.clicked.connect(MainWindow.close) #点关闭时关闭窗口
self.pushButton_3.clicked.connect(self.lineEdit.clear) #点清空时清空输入框
在第三个文件里,我们定义了tokenprocess方法来执行主进程。
所以在后面需要新增一条,即可实现调用
self.pushButton.clicked.connect(MainWindow.tokenprocess) #在点确认时调用主程序
2.需要把 MainWindow.setCentralWidget(self.centralwidget)等所有MainWindow开头的注释掉否则会报错
以下是第一个文件完整代码
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(436, 548)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(60, 180, 121, 21))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(60, 140, 161, 21))
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(210, 180, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(310, 380, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(60, 240, 54, 12))
self.label_2.setObjectName("label_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(310, 180, 75, 23))
self.pushButton_3.setObjectName("pushButton_3")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(60, 270, 221, 201))
self.textEdit.setObjectName("textEdit")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(310, 440, 75, 23))
self.pushButton_4.setObjectName("pushButton_4")
# MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 436, 23))
self.menubar.setObjectName("menubar")
# MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
self.retranslateUi(MainWindow)
self.pushButton_4.clicked.connect(MainWindow.close) #点关闭时关闭窗口
self.pushButton_3.clicked.connect(self.lineEdit.clear) #点清空时清空输入框
self.pushButton.clicked.connect(MainWindow.tokenprocess) #在点确认时调用主程序
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "token生成器"))
self.lineEdit.setText(_translate("MainWindow", "00000000"))
self.label.setText(_translate("MainWindow", "请输入需要生成token的工号:"))
self.pushButton.setText(_translate("MainWindow", "确认"))
self.pushButton_2.setText(_translate("MainWindow", "复制"))
self.label_2.setText(_translate("MainWindow", "执行结果:"))
self.pushButton_3.setText(_translate("MainWindow", "清空"))
self.textEdit.setHtml(
_translate(
"MainWindow",
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">\n'
'<html><head><meta name="qrichtext" content="1" /><style type="text/css">\n'
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
'<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html>',
)
)
self.pushButton_4.setText(_translate("MainWindow", "关闭"))
至此代码部分就完成了,接下来是打包。
打包程序
先装一个插件
pip install pyinstaller
装好可以直接在控制台输入
pyinstaller -F main.py
执行后在dist目录下生成了exe文件。
双击打开试用一下
测试了没什么问题发给开发了。。还记得当时想写这个就是想以后请假时他们不要找我。
完成这篇时已经过了一个月了,基本没再找过我了。。
我想了下,其实还可以做点别的,比如加一个图标,加一个背景之类的…待续…
好文分享
下面是我在完成以上内容参考的文档。
大家如果遇到问题也可以在以下文档中找找答案!同时谢谢下面的作者!!
Python制作小软件——2. 实现界面中的退出功能
python从入门到精通——GUI编程
python:使用PyInstaller打包成exe文件,以及TypeError: an integer is required (got type bytes)异常解决