1.5 PySide/PyQt的启动方式

Chapter01\runDemo.py是PySide 6应用的最基本形式,新建一个继承QWidget的WinForm类,并根据实际情况来实现自定义的窗口。QWidget窗口默认允许一些操作,如修改窗口的大小、最大化窗口、最小化窗口等,这些都不需要自己定义。

执行结果如图1-59所示,单击Close按钮会关闭窗口。

图1-59

下面对这种启动方式进行解读。

【代码分析】

使用下面这行代码可以避免在所生成的PySide程序中出现中文乱码:

下面这些代码是程序运行的主体,这里展示了PySide6程序开发的最小demo。PySide6.QtWidgets模块包含GUI开发所需要的绝大多数类,QWidget更是绝大多数控件的父类:

每个PySide 6程序都需要有一个QApplication对象,QApplication对象包含在QtWidgets模块中。sys.argv是一个命令行参数列表。Python脚本可以从Shell中执行,也可以携带参数,这些参数会被sys.argv捕获,代码如下:

实例化WinForm(),并在屏幕上显示,代码如下:

app.exec()是QApplication对象的函数,exec()函数的作用是“进入程序的主循环直到exit()被调用”。如果没有exec()函数,win.show()函数也会起作用,只是运行的时候窗口会闪退,这是因为没有“进入程序的主循环”就直接结束了。使用sys.exit()函数退出可以确保程序完整地结束,在这种情况下系统的环境变量会记录程序是如何退出的。代码如下:

如果程序运行成功,那么exec()函数的返回值为0,否则为非0。

在正常情况下,使用这种方式启动没有什么问题。但是如果在IPython控制台上通过复制粘贴的方式运行代码,就可能会遇到以下两个问题。

1.无法实例化

报错信息如下:

出现这个问题主要是因为之前已经实例化QApplication对象,无法再次实例化,解决方法如下:

QApplication.instance()表示如果QApplication对象已经实例化则返回其实例,否则返回None。

2.报错或直接退出

报错信息如下:

这是因为使用sys.exit()函数会引发一个通常用于退出Python的SystemExit异常。IPython控制台的Shell会捕获该异常,并显示警告。但这其实不会影响程序,所以可以忽略这条消息。

如果读者觉得这个异常非常讨厌,则可以把sys.exit(app.exec())替换成app.exec(),也就是去掉sys.exit(),在一般情况下不影响结果。如果这样做程序不能完全退出,则可以对如下两行代码任选其一,其效果是一样的:

完整代码如下(见Chapter01\runDemo2.py):

在后续章节中,不会刻意使用某种启动方式,因为无论使用哪种启动方式都可以成功运行本书所有的程序。


[1]图中“MacOS”的正确写法应为“macOS”。