最近要做一个网站部署工具,该工具包括检查服务器硬件环境、数据库操作、服务器程序安装、配置文件修改等四大模块;考虑到可能需要结合各种功能和用到很多三方库,自然就想到了Python语言;并且还需要做成界面工具,之前也用过Qt开发,所以用PyQt是非常合适的。最终做完发现真的挺好的,可以结合各种三方库,开发非常迅速,运行速度感觉和Qt比并没有差很多,甚至有的地方用对三方库要比Qt更快,当然,可能也是因为我这个是简单的一个部署工具,功能并不复杂。
pip install pyqt5
pip install pyqt5-tools
Program参数:D:\Program Files (x86)\Python\Python38\Lib\site-packages\pyqt5_tools\Qt\bin\designer.exe
Working directory参数: P r o j e c t F i l e D i r ProjectFileDir ProjectFileDir
注意:如果Qt Designer启动失败,需要将D:\Program Files (x86)\Python\Python38\Lib\site-packages\pyqt5_tools\Qt目录下的plugins目录拷贝到D:\Program Files (x86)\Python\Python38\Lib\site-packages\pyqt5_tools\Qt\bin目录中即可。
Program参数:D:\Program Files (x86)\Python\Python38\Scripts\pyuic5.exe
Arguments参数: F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension.py
Working directory参数: F i l e D i r FileDir FileDir
import sys
from PyQt5.QtWidgets import QApplication
from GenerateTools import GenerateTools
if __name__ == "__main__":
app = QApplication(sys.argv)
tools = GenerateTools()
tools.show()
sys.exit(app.exec_())
from PyQt5.QtCore import QObject, pyqtSignal
import xlwt
import traceback
class CartonLabelGenerater(QObject):
def __init__(self, parent=None):
super(CartonLabelGenerater, self).__init__(parent)
self.info_dict = {
}
self.save_path = ""
# 定义信号
sig_refresh = pyqtSignal(str)
sig_stop = pyqtSignal()
def set_value(self, info_dict, save_path):
self.info_dict = info_dict
self.save_path = save_path
def start(self):
print('start')
print(self.info_dict)
self.sig_refresh.emit("生成成功")
self.sig_stop.emit()
def connect_event(self):
self.comboBox_num.currentTextChanged.connect(self.slot_combo_changed)
self.lineEdit_number.textChanged.connect(self.slot_line_edit_number_changed)
self.pushButton_2.clicked.connect(self.slot_click_button)
self.carton_label_thread.started.connect(self.carton_label_generater.start)
self.Btn_save.clicked.connect(self.slot_click_save_btn)
# 连接信号和槽函数
self.carton_label_generater.sig_refresh.connect(self.slot_show_result)
self.carton_label_generater.sig_stop.connect(self.carton_label_thread.quit)
使用Qt Designer新建.ui文件后,需要使用PyUIC工具将ui文件转换为.py文件,才能被Python识别;如果在生成的py文件中进行了修改,当再次用PyUIC重新生成时,会将修改的地方清除,所以需要重新封装一个类,多继承自该py文件,这样对界面的修改就不会被清掉了。如下:
class GenerateTools(QWidget, Ui_Form):
def __init__(self):
super(GenerateTools, self).__init__()
# Set up the user interface from Designer.
self.setupUi(self)
# 多线程
self.carton_label_thread = QThread()
self.carton_label_generater = CartonLabelGenerater()
self.carton_label_generater.moveToThread(self.carton_label_thread)
# Make some local modifications
self.init_ui()
# Connect up the buttons.
self.connect_event()
其中Ui_Form类就是我的ui文件生成的py文件中的类;详细教程请参考官网:PyQt5官网地址
在ui文件中的资源浏览器中新建qrc文件,并添加图标的资源文件即可,如下图所示:
添加保存后,需要调用PyRCC工具,将qrc文件转换为py文件,即可引入该py文件进行使用。
class GenerateTools(QWidget, Ui_Form):
def __init__(self):
super(GenerateTools, self).__init__()
# Set up the user interface from Designer.
self.setupUi(self)
# 多线程
self.carton_label_thread = QThread()
self.carton_label_generater = CartonLabelGenerater()
self.carton_label_generater.moveToThread(self.carton_label_thread)
# Make some local modifications
self.init_ui()
# Connect up the buttons.
self.connect_event()
def connect_event(self):
self.comboBox_num.currentTextChanged.connect(self.slot_combo_changed)
self.lineEdit_number.textChanged.connect(self.slot_line_edit_number_changed)
self.pushButton_2.clicked.connect(self.slot_click_button)
self.carton_label_thread.started.connect(self.carton_label_generater.start)
self.Btn_save.clicked.connect(self.slot_click_save_btn)
# 连接信号和槽函数
self.carton_label_generater.sig_refresh.connect(self.slot_show_result)
self.carton_label_generater.sig_stop.connect(self.carton_label_thread.quit)
def slot_click_button(self):
print('slot_click_button')
info_dict = {
self.label_name.text(): self.lineEdit_name.text(),
self.label_quantiy.text(): self.lineEdit_quantity.text(),
self.label_gross_weight.text(): self.lineEdit_gross_weight.text(),
self.label_carton_no.text(): self.lineEdit_carton_no.text(),
self.label_carton_size.text(): self.lineEdit_carton_size.text(),
}
# 线程传参
self.carton_label_generater.set_value(info_dict, self.lineEdit_save.text())
self.carton_label_thread.start()
pip install pyinstaller
跳转到工程目录文件夹下,运行以下命令:
pyinstaller -F -w -i picture.ico main.py
win32和win64是需要注意区分的,64位的PyQt5版本只能打包64位的运行程序,如果要打包32位的,需要搭建32位的PyQt5环境,重新打包。
3.8.0的Python版本打包生成的程序在windows server服务器上运行有问题,回退到3.7.5版本的Python和PyQt5环境,打包的程序是可以正常运行的,暂时还不知道原因。