个人博客:苏三有春的博客
系列往期文章:
PyQt5实战——多脚本集合包,前言与环境配置(一)
PyQt5实战——多脚本集合包,UI以及工程布局(二)
PyQt程序入口(QMainWindow)
main.py是程序的入口,程序最开始运行的文件,在这个文件中,需要完成以下几件事:
- 创建一个MainWindow(主窗口)
- 设置主窗口的标题,图标
- 设置窗口的主体(centralWidget)
- 设置窗口的状态栏
- 创建workspaces目录
- 运行窗口
import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *import PrimeWindowclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Script Tools")self.setWindowIcon(QIcon("_internal/res/icon/icon.ico"))centralWidget = PrimeWindow.PrimeWindow()self.setCentralWidget(centralWidget)self.addStatusBar()def addStatusBar(self):self.statusBar = QStatusBar()self.statusWidget = QWidget()self.statusLayout = QHBoxLayout()self.copyrightlable = QLabel("© Author: LyricalRover. All rights reserved.")self.versionlable = QLabel("Last updated: 2024-10-18. Version: 1.3.1")self.statusLayout.addWidget(self.copyrightlable)self.statusLayout.addStretch()self.statusLayout.addWidget(self.versionlable)self.statusWidget.setLayout(self.statusLayout)self.statusBar.addWidget(self.statusWidget)self.setStatusBar(self.statusBar)if __name__ == "__main__":app = QApplication(sys.argv)w = MainWindow()if not os.path.exists("workspaces"):os.makedirs("workspaces")w.show()app.exec()
最开始进入的地方是:if__name__ == “_main_”:
app = QApplication(sys.argv)初始化应用程序对象
1.
QApplication
类
QApplication
是 Qt 应用程序的主类,负责管理应用程序的控制流和主要设置。- 它处理应用程序的主事件循环,并为 GUI 元素提供必要的支持。
- 每个使用 Qt 的应用程序通常需要一个
QApplication
实例。2.
sys.argv
的作用
sys.argv
是一个列表,包含命令行参数。这些参数是在运行 Python 脚本时传递的。QApplication
可以使用这些参数来配置应用程序的行为,例如窗口大小、样式等。3. 初始化应用程序
通过
app = QApplication(sys.argv)
,你完成了以下几个步骤:
- 创建应用程序对象:这行代码创建了一个
QApplication
的实例,并将命令行参数传递给它。- 设置事件循环:这个实例负责管理 GUI 的事件循环,使得应用程序能够响应用户输入和事件(例如鼠标点击、键盘输入等)。
- 为应用程序提供上下文:
QApplication
提供了关于应用程序的信息,例如样式、主题、字体等。
创建MainWindow对象,即运行上面的class中的代码
def __init__
中,设置窗口的标题,设置窗口的图标,在这里可以看到,设置图标的路径是:_internal/res/icon/icon.ico,但我们并没有创建这个__internal的目录,回顾环境配置中pyinstaller部分的讲解:“pyinstaller在v6.0版本以后,数据将被移动到__internal
目录下”,也就是说,如果我们打包程序形成exe文件后,想要文件能够正确找到icon的地址,则必须在你写的地址前加上__internal
目录,配合上打包时的参数,-add-data "icon.ico;__internal/res/icon/icon.ico"
,就可以在打包后显示正常的图标。
centralWidget = PrimeWindow.PrimeWindow()
上面的代码是创建一个UI主体,该主体是PrimeWindow对象,这个类在PrimeWindow.py中,这个主体内具体是怎样的后面会讲到。
addStatusBar的结构如下图所示:
左右分别是两个label的Widget,分别装了两条信息,中间用addStretch弹簧将两个label分压向两侧。
理想很丰满,现实很骨感,实际上并没有呈现出这样一个操作,我猜测应该是有另一个东西阻碍了StatusBar,并没有完整占据整个窗口的下方,也就是说,StatusBar本身被压缩了,导致versionlabel并没有被压向窗口主体的右侧。但具体原因尚不明朗。
还有一点值得注意的是:
我在引入第三方库的时候因为偷懒使用了“*”,即:from PyQt5.QtWidgets import *等。
建议使用了什么就引入import什么,而不是为了图方便而直接使用“*”,理由如下:
- python模块的导入实际上是通过
import
来进行导入的,一个模块一旦被导入,后续的导入操作则直接从缓存中读出,而不会重复导入,这就说明,在初次操作时,需要加载导入内容,如果使用“*”,初次导入的时间开销会更多一些,但后续的性能差别并不明显。 - 由于
import *
会导入所有的公共成员,因此它可能会占用更多的内存,因此空间开销会更大。 - 使用更明确的导入方式,会有助于代码的可读性,避免不必要的模块加载,减少潜在的时间和空间开销,同时较少命名冲突的风险,这种情况在大型项目中更为明显。