PyQt编程快速上手
上QQ阅读APP看书,第一时间看更新

1.2.3 在类中创建窗口

PyQt程序的代码不应该全部挤在程序入口处,因为我们要用到的控件可能不止一个。如果在程序入口处实例化多个控件对象,就会出现多个窗口,详见示例代码1-4。

示例代码1-4

import sys
from PyQt5.QtWidgets import *
 
if __name__ == '__main__':
    app = QApplication([])
    label_1 = QLabel('Label 1')
    label_2 = QLabel('Label 2')
    label_1.show()
    label_2.show()
    sys.exit(app.exec())

运行结果如图1-8所示。

图1-8 多个窗口

很明显,这不是我们想要的。我们希望能够在一个窗口上同时显示两个QLabel控件。为了实现这种需求,也为了让代码更好管理,我们通常会在一个类中编写窗口,详见示例代码1-5。

示例代码1-5

import sys
from PyQt5.QtWidgets import *
 
class Window(QWidget):                         # 1
    def __init__(self):
        super(Window, self).__init__()
        label_1 = QLabel('Label 1', self)      #注释2开始
        label_2 = QLabel('Label 2', self)      #注释2结束
 
if __name__ == '__main__':
    app = QApplication([])
    window = Window()                          #注释3开始
    window.show()                              #注释3结束
    sys.exit(app.exec())

代码解释:

#1 让编写的Window类继承QWidget。大家可以把QWidget看成一个空白的窗口,而我们要做的就是往里面添加控件。

#2 在Window类中,我们实例化两个QLabel控件对象。在该程序中,QLabel除了接收一个字符串,还指明一个父类实例对象self,这样QLabel控件就能够显示在窗口上。

#3 在程序入口处,我们实例化Window对象,并调用show()方法将窗口显示出来。

当对一个窗口调用show()方法之后,窗口中的控件会一同显示出来,不必再调用自身的show()方法。

运行结果如图1-9所示。

图1-9 在类中编写窗口

图1-9所示的窗口中同时出现了“Label 1”和“Label 2”两个文本,但它们是重合的,原因在于我们没有对两个QLabel控件进行布局。在1.3节,我们将会学习使用布局管理器来让窗口更加整洁有序。