上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节,我们将会学习使用布局管理器来让窗口更加整洁有序。