PyQt5实战——多脚本集合包,程序入口QMainWindow(三)

个人博客:苏三有春的博客

系列往期文章:
PyQt5实战------多脚本集合包,前言与环境配置(一)
PyQt5实战------多脚本集合包,UI以及工程布局(二)

PyQt程序入口(QMainWindow)

main.py是程序的入口,程序最开始运行的文件,在这个文件中,需要完成以下几件事:

  • 创建一个MainWindow(主窗口)
  • 设置主窗口的标题,图标
  • 设置窗口的主体(centralWidget)
  • 设置窗口的状态栏
  • 创建workspaces目录
  • 运行窗口
python 复制代码
import sys
import os 
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

import PrimeWindow

class 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",就可以在打包后显示正常的图标。

python 复制代码
centralWidget = PrimeWindow.PrimeWindow()

上面的代码是创建一个UI主体,该主体是PrimeWindow对象,这个类在PrimeWindow.py中,这个主体内具体是怎样的后面会讲到。

addStatusBar的结构如下图所示:

左右分别是两个label的Widget,分别装了两条信息,中间用addStretch弹簧将两个label分压向两侧。

理想很丰满,现实很骨感,实际上并没有呈现出这样一个操作,我猜测应该是有另一个东西阻碍了StatusBar,并没有完整占据整个窗口的下方,也就是说,StatusBar本身被压缩了,导致versionlabel并没有被压向窗口主体的右侧。但具体原因尚不明朗。

还有一点值得注意的是:

我在引入第三方库的时候因为偷懒使用了"*",即:from PyQt5.QtWidgets import *等。

建议使用了什么就引入import什么,而不是为了图方便而直接使用"*",理由如下:

  1. python模块的导入实际上是通过import来进行导入的,一个模块一旦被导入,后续的导入操作则直接从缓存中读出,而不会重复导入,这就说明,在初次操作时,需要加载导入内容,如果使用"*",初次导入的时间开销会更多一些,但后续的性能差别并不明显。
  2. 由于import *会导入所有的公共成员,因此它可能会占用更多的内存,因此空间开销会更大。
  3. 使用更明确的导入方式,会有助于代码的可读性,避免不必要的模块加载,减少潜在的时间和空间开销,同时较少命名冲突的风险,这种情况在大型项目中更为明显。
相关推荐
火云洞红孩儿2 小时前
告别界面孤岛:PyMe如何用一站式流程重塑Python GUI开发?
开发语言·python
叫我辉哥e13 小时前
新手进阶Python:办公看板集成ERP跨系统同步+自动备份+AI异常复盘
开发语言·人工智能·python
晚风吹长发3 小时前
初步了解Linux中的命名管道及简单应用和简单日志
linux·运维·服务器·开发语言·数据结构·c++·算法
C++ 老炮儿的技术栈3 小时前
不调用C++/C的字符串库函数,编写函数strcpy
c语言·开发语言·c++·windows·git·postman·visual studio
布局呆星3 小时前
闭包与装饰器
开发语言·python
fyzy4 小时前
C++写后端实现,实现前后端分离
开发语言·c++
全栈测试笔记4 小时前
异步函数与异步生成器
linux·服务器·前端·数据库·python
huohuopro4 小时前
Mybatis的七种传参方式
java·开发语言·mybatis
Lee_SmallNorth4 小时前
变态需求之【角色不同访问数据库的用户不同】
java·开发语言·数据库
扶苏-su4 小时前
Java网络编程:InetAddress 详解
java·开发语言·网络