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环境,打包的程序是可以正常运行的,暂时还不知道原因。

03-13
### PyQt5 使用指南 PyQt5 是一个功能强大的 Python 绑定库,用于 Qt 应用程序框架。它提供了丰富的工具集,可以用来开发跨平台的图形用户界面 (GUI) 应用程序[^1]。 #### 安装 PyQt5 要安装 PyQt5,可以通过 pip 工具完成: ```bash pip install pyqt5 ``` 如果需要额外的功能模块(如 WebEngine 或 Multimedia),也可以通过指定包名的方式单独安装这些扩展组件。 #### 创建简单的 GUI 应用程序 下面是一个基本的例子,展示如何创建一个带有按钮的小型窗口应用程序: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout class ExampleApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): button = QPushButton('Click Me', self) layout = QVBoxLayout() layout.addWidget(button) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) ex = ExampleApp() ex.show() sys.exit(app.exec_()) ``` 这段代码定义了一个继承自 `QWidget` 的类,并设置了布局和控件。 #### 常见问题及其解决方案 1. **无法导入 PyQt5** 如果遇到错误提示 “No module named 'PyQt5'”,可能是因为未正确安装 PyQt5。重新运行安装命令并确认环境变量配置无误。 2. **信号与槽机制不生效** 在连接信号到槽时,需注意语法格式是否匹配。例如,使用 `button.clicked.connect(function)` 来绑定点击事件。 3. **集成 Scrapy 和 PyQt5** 当尝试将 Scrapy 集成至 PyQt5 中时,推荐采用 CrawlerProcess 方法启动爬虫逻辑。此方法允许在独立线程中执行异步操作而不阻塞主线程[^2]。 #### 参考资源链接 对于更深入的学习需求,可查阅官方文档以及社区贡献的相关书籍或视频课程。以下是几个重要的参考资料来源: - [PyQt5 官方文档](https://www.riverbankcomputing.com/static/Docs/PyQt5/) - YouTube 上由 Miguel Grinberg 提供的教学系列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

书灯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值