![PySide 6/PyQt 6快速开发与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/388/46418388/b_46418388.jpg)
1.5 PySide/PyQt的启动方式
Chapter01\runDemo.py是PySide 6应用的最基本形式,新建一个继承QWidget的WinForm类,并根据实际情况来实现自定义的窗口。QWidget窗口默认允许一些操作,如修改窗口的大小、最大化窗口、最小化窗口等,这些都不需要自己定义。
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_61_1.jpg?sign=1739284760-yKNhsfHuFOVWFkWI9MDBNgUprRIVfZbK-0-6b68e5537868d50dda8b4841e82e855d)
执行结果如图1-59所示,单击Close按钮会关闭窗口。
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_61_2.jpg?sign=1739284760-axfF9sRlQzB1FfsUBfPv00HZM7AVUgkp-0-fe1bc222802d79bc4d0e369e8b9eec83)
图1-59
下面对这种启动方式进行解读。
【代码分析】
使用下面这行代码可以避免在所生成的PySide程序中出现中文乱码:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_61_3.jpg?sign=1739284760-3OYjRLabJPwNiSVZ7vMkIcCRqvrg9fkU-0-117a84cb3f00dc05fbe20b8d5d6685bc)
下面这些代码是程序运行的主体,这里展示了PySide6程序开发的最小demo。PySide6.QtWidgets模块包含GUI开发所需要的绝大多数类,QWidget更是绝大多数控件的父类:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_61_4.jpg?sign=1739284760-UcRk2cXtt4t8GZBgCrvQFrPXSWldtNbl-0-ec3817c56dd0f02d9627720cd064f85d)
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_62_1.jpg?sign=1739284760-X1vqGiVFIbM07ZK6g5zHGL4MHMkerlZ1-0-0f15c480b534927504dfbc42c41848e3)
每个PySide 6程序都需要有一个QApplication对象,QApplication对象包含在QtWidgets模块中。sys.argv是一个命令行参数列表。Python脚本可以从Shell中执行,也可以携带参数,这些参数会被sys.argv捕获,代码如下:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_62_2.jpg?sign=1739284760-9O8JhI3XB2rSXQUghsYcAkVEmBMURDMl-0-dc9882db0907778facc73e15b5d32079)
实例化WinForm(),并在屏幕上显示,代码如下:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_62_3.jpg?sign=1739284760-7jV1VCSc7W7ytqkEbgEdraCL380xgamw-0-d008d9119d64cb714d0382f0f9802f4a)
app.exec()是QApplication对象的函数,exec()函数的作用是“进入程序的主循环直到exit()被调用”。如果没有exec()函数,win.show()函数也会起作用,只是运行的时候窗口会闪退,这是因为没有“进入程序的主循环”就直接结束了。使用sys.exit()函数退出可以确保程序完整地结束,在这种情况下系统的环境变量会记录程序是如何退出的。代码如下:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_62_4.jpg?sign=1739284760-xSU52ed9exFKBIX9T5iboZhxHVJBAXUd-0-0fa538ae951be5b73d6b43b46755c499)
如果程序运行成功,那么exec()函数的返回值为0,否则为非0。
在正常情况下,使用这种方式启动没有什么问题。但是如果在IPython控制台上通过复制粘贴的方式运行代码,就可能会遇到以下两个问题。
1.无法实例化
报错信息如下:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_62_5.jpg?sign=1739284760-RQrNKeuNEuJvRdju82eYTX9fXwBueMo3-0-a1a52777cf6640a0da07aabad890fd5a)
出现这个问题主要是因为之前已经实例化QApplication对象,无法再次实例化,解决方法如下:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_62_6.jpg?sign=1739284760-G8holNZuewMmEV59nXl1Di6CLJkSq55i-0-20dd9cfc297735bc6bd86d492d6d9d2c)
QApplication.instance()表示如果QApplication对象已经实例化则返回其实例,否则返回None。
2.报错或直接退出
报错信息如下:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_63_1.jpg?sign=1739284760-TlDYVBLlJyyDfmWtdMZIcu5w3hx3m2Es-0-6c58d35ca6dd43510b8b84b070b5b9e7)
这是因为使用sys.exit()函数会引发一个通常用于退出Python的SystemExit异常。IPython控制台的Shell会捕获该异常,并显示警告。但这其实不会影响程序,所以可以忽略这条消息。
如果读者觉得这个异常非常讨厌,则可以把sys.exit(app.exec())替换成app.exec(),也就是去掉sys.exit(),在一般情况下不影响结果。如果这样做程序不能完全退出,则可以对如下两行代码任选其一,其效果是一样的:
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_63_2.jpg?sign=1739284760-9CwuChNAWznEuLBvxyUGThBi6w1YANvO-0-c8d2ad8ac9ddc0477c42210ca59ad295)
完整代码如下(见Chapter01\runDemo2.py):
![](https://epubservercos.yuewen.com/7E60F4/25638742209049106/epubprivate/OEBPS/Images/44525_63_3.jpg?sign=1739284760-vHToUdmsXBX6Sa95imcIX4Qu31o0d7fD-0-a7228b6d8e01df4b15e28da0d8bb73a0)
在后续章节中,不会刻意使用某种启动方式,因为无论使用哪种启动方式都可以成功运行本书所有的程序。
[1]图中“MacOS”的正确写法应为“macOS”。