PyQt入门1

针对工作中存在的重复性流程,将核心功能进行可视化封装,通过界面化引导执行并打包为独立的可执行程序(exe),便于快速上手、一键操作

目录

环境安装

实际使用

问题记录

环境安装:

windows:直接pip安装即可,使用百度镜像安装命令如下,此处pyinstaller模块用来将python代码打包成exe。

1
pip install -i https://mirrors.baidu.com/pypi/simple PyQt5 pyinstaller

实际使用:

Step1、窗口构建

常见控件:QLabel(文本控件)、QLineEdit(输入框)、QPushButoon(按钮)、按钮触发功能实现。

以QLabel控件为例:可插入文字、图片,也可将QLabel控件插入到QLabel中叠加使用。

  • 创建方式:
1
2
3
4
5
6
7
8
9
10
11
# 添加文字
# 方式一
label = QLabel(text) # text为要添加的文本
#方式二
label = QLabel()
label.setText("This is a QLabel")

# 添加图片
img_label = QLabel()
pixmap = QPixmap(img_path)
img_label.setPixmap(pixmap)
  • 自定义位置、大小:
1
2
3
4
5
6
#方式一
qlabel = QLabel()
qlabel.move(x, y)
qlabel.resize(w, h)
#方式二
qlabel.setGeometry(x, y, w, h)
  • 调整控件样式:setStyleSheet
1
2
3
4
5
6
7
# 自定义位置
# padding-left表示到左边的距离,padding-top到顶部的距离
label.setStyleSheet("padding-left:10px; border-radius: 10px;background-color: white;")

# 固定左对齐、居中等
# 设置文本位置,将文本水平和垂直居中对齐
label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
  • 叠加使用:(QLabel包含Qlabel)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QScrollArea

if __name__ == '__main__':
app = QApplication(sys.argv)

# 创建一个滚动区域
scroll_area = QScrollArea()

# 创建一个 QWidget 作为滚动区域的内容
container = QWidget(scroll_area)

not_other_num = 0 # 父 QLabel 的数量计数器
y_offset = 0 # 控制纵向位置的偏移量

for i in range(9): # 示例循环 5 次
# 创建父级 QLabel
parent_label = QLabel(container)
parent_label.setGeometry(0, y_offset, 200, 50) # 设置父级 QLabel 的位置和大小
parent_label.setStyleSheet("background-color: yellow;") # 设置父级 QLabel 的背景颜色

# 创建两个包含文字的 QLabel
label1 = QLabel("Label 1", parent=parent_label)
label1.setGeometry(10, 10, 80, 30) # 设置第一个 QLabel 的位置和大小
label1.setStyleSheet("background-color: red") # 设置第一个 QLabel 的背景颜色

label2 = QLabel("Label 2", parent=parent_label)
label2.setGeometry(100, 10, 80, 30) # 设置第二个 QLabel 的位置和大小
label2.setStyleSheet("background-color: blue") # 设置第二个 QLabel 的背景颜色

not_other_num += 1
y_offset += 60 # 更新纵向位置偏移量

# 设置容器的固定大小
container.setFixedSize(200, y_offset)

# 将容器设置为滚动区域的 widget
scroll_area.setWidget(container)

scroll_area.show()

sys.exit(app.exec_())

实现:将父级QLabel添加到一个Widget()中,然后将Widget存放到滚动区域QScrollArea里

!!!注意:当自定义设置QScrollArea大小时,QWidget大小必须大于QScrollArea大小,才能有效实现结果。

Step2、简单应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QVBoxLayout, QLineEdit
from utils.excel_utils import numberAndCount # 个人功能函数,替换


class MyWindow(QWidget):
def __init__(self):
super().__init__()

# 创建界面
self.setWindowTitle('测试平台') # 界面名称
self.resize(640,480)
# self.setGeometry(100, 100, 640, 480)

# 在窗口里面添加label控件
self.label1 = QLabel('Path1:', self)
self.label1.setGeometry(20, 20, 100, 30) # 设置文本框的位置和大小 (x,y, w, h)

# 在窗口里面添加输入框控件
self.input_field1 = QLineEdit(self)
self.input_field1.setPlaceholderText("输入统计地址:./tmp_data") # 在输入框中添加提示
self.input_field1.setGeometry(90, 25, 300, 20)

self.label2 = QLabel('Path2:', self)
self.label2.setGeometry(20, 50, 100, 30) # (x,y, h, w)
self.input_field2 = QLineEdit(self) # 创建
self.input_field2.setPlaceholderText("输入excel保存地址:./tmp.xlsx") # 在输入框中添加提示
self.input_field2.setGeometry(90, 55, 300, 20)

# 在窗口里面添加按钮控件
self.submit_button = QPushButton("运行", self)
self.submit_button.setGeometry(50, 100, 70, 30)
self.submit_button.clicked.connect(self.on_button_click) # 按钮触发

def on_button_click(self):
# 函数调用,替换成自己的函数
# train_path_root = "./tmp_data"
# excel_save_path = "./tmp.xlsx"
train_path_root = self.input_field1.text()
excel_save_path = self.input_field2.text()
numberAndCount(train_path_root, excel_save_path)


# 主程序
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow() # 继承QWidget类
window.show() # 界面显示
sys.exit(app.exec_()) # 循环显示界面

可视化界面如下:

Step3、打包exe

在目标目录打开终端,使用python的pyinstaller对.py文件进行打包,如果打包的程序是图形界面程序,添加-w,则打包后打开exe文件将只出现图形界面,命令行窗口将被隐藏。命令如下:

1
pyinstaller -w .py文件

将在该目录下生成dist文件和.spec,exe在dist文件下。


问题记录:

主要出现在打包的时候:

问题1、打包时出现RecursionError: maximum recursion depth exceeded错误,网上搜索表示程序中包含递归函数,但经过检查后代码中并不存在.

解决:重新安装pyinstaller后解决

问题2、使用conda环境打包时,打包后的exe文件打开后提示无法引用PyQt5。

解决:使用 –path 将pyqt5的runw.exe地址手动传入。

1
pyinstaller --path=d:\software\Anaconda3\envs\pytorch\Lib\site-packages\PyInstal ler\bootloader\Windows-64bit-intel\runw.exe -w pyqt.py

版本历史

  • 2024-02-20:完成文档初版
  • 2024-05-05:完善文档格式及结构,添加目录