PyQt5

背景

最近要做一个网站部署工具,该工具包括检查服务器硬件环境、数据库操作、服务器程序安装、配置文件修改等四大模块;考虑到可能需要结合各种功能和用到很多三方库,自然就想到了Python语言;并且还需要做成界面工具,之前也用过Qt开发,所以用PyQt是非常合适的。最终做完发现真的挺好的,可以结合各种三方库,开发非常迅速,运行速度感觉和Qt比并没有差很多,甚至有的地方用对三方库要比Qt更快,当然,可能也是因为我这个是简单的一个部署工具,功能并不复杂。

环境搭建(Python3.8.2+PyQt5.15.0+PyCharm)

安装PyQt5

pip install pyqt5

安装pyqt5-tools

pip install pyqt5-tools

配置扩展工具

配置Qt Designer

点击Settings
在这里插入图片描述
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目录中即可。

配置PyUIC

在这里插入图片描述
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

配置PyRCC

在这里插入图片描述
参数和PyUIC类似。

Demo示例

main函数

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

使用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()

打包

安装打包工具pyinstaller

pip install pyinstaller

打包命令

跳转到工程目录文件夹下,运行以下命令:

pyinstaller -F -w -i picture.ico main.py
  • -F指只生成一个exe文件,不生成其它的dll文件;
  • -w不弹出命令行窗口;
  • -i设置程序图标,其后面跟着的ico文件就是程序图标;
  • main.py就是要打包的程序;
    最终会在当前目录下生成dist文件夹,打包好的文件就存放在该文件夹中。

注意事项

win32和win64是需要注意区分的,64位的PyQt5版本只能打包64位的运行程序,如果要打包32位的,需要搭建32位的PyQt5环境,重新打包。
3.8.0的Python版本打包生成的程序在windows server服务器上运行有问题,回退到3.7.5版本的Python和PyQt5环境,打包的程序是可以正常运行的,暂时还不知道原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值