基本环境如下:
Windows 10
Python 3.7
PyCharm 2019.3.3 x64
PyQt5相关的库:
PyQt5 5.13.0
PyQt5-sip 12.8.0
pyqt5-tools 5.13.0.1.5
先将代码展示如下,然后我们简单分析。
# coding = utf-8
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv)
mywidget = QWidget()
mywidget.resize(500, 300)
mywidget.move(600, 300)
mywidget.setWindowTitle('pyqt5的第一个应用')
mywidget.show()
sys.exit(app.exec_())
运行结果如下:
简单分析源代码。
if __name__ == '__main__':
该行代码为起始处,表示的含义为:如果写了这句话并将执行的语句放到这个判断语句的后面,那么只有在程序本身被执行的时候才能运行这个判断语句下面的语句。否则程序被作为模块导入的时候就会执行。
app = QApplication(sys.argv)
每个PyQt5应用程序必须创建一个应用程序对象。 sys.argv参数是来自命令行的参数列表。 Python脚本可以从shell运行。 写了这句话就能让我们的程序从命令行启动。
mywidget = QWidget()
QWidget小部件是PyQt5中所有用户界面对象的基类。 我们提供了QWidget的默认构造函数。 默认构造函数没有父类。 没有父类口小部件称为窗口。
mywidget.resize(500, 300)
mywidget.move(600, 300)
resize()方法调整窗口小部件的大小。这里我们设定窗口的大小:宽500像素,高300像素。
move()方法将小部件移动到屏幕上x = 600,y = 300坐标处的位置。这里我们来看一下屏幕坐标是怎么设定的,来看看下图。
mywidget.setWindowTitle('pyqt5的第一个应用')
mywidget.show()
setWindowTitle()方法用于设置窗口的标题。
show()方法在屏幕上显示窗口小部件。 一个小部件首先在内存中创建,然后在屏幕上显示。
sys.exit(app.exec_())
最后,我们进入应用程序的主循环(main loop)。 事件处理从这一点开始。 主循环(main loop)从窗口系统接收事件并将它们分派到应用程序小部件。 如果我们调用exit()方法或者主窗口小部件被破坏,那么主循环(main loop)就会结束。
sys.exit()方法确保一个干净的退出。
exec_()方法有一个下划线。 这是因为exec是一个Python关键字。 因此,使用exec_()。
注意:为了便于初学者理解,我们把主循环(main loop)简单的谈一下。GUI应用程序都是事件驱动的。比如键盘事件、鼠标事件等等。还有一些事件来自于系统内部,比如定时事件、其它文件事件等等。在没有任何事件的情况下,应用程序处于睡眠状态。这种事件驱动机制,GUI应用程序都需要一个主循环(main loop)。主循环(main loop)控制应用程序什么时候进入睡眠状态,什么时候被唤醒。所以主循环(main loop)就是干这个的。
实现的功能为在窗口增加标签和按钮,并实现点击按钮时,标签的数字变化
先将代码展示如下,然后我们简单分析。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton,QLabel
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.num = 1
self.setGeometry(300, 300, 500, 320)
self.setWindowTitle('pyqt5的第二个应用')
self.label = QLabel("QLabel显示数字为{}".format(self.num), self)
self.label.move(180, 50)
self.btn = QPushButton('button', self)
self.btn.resize(70, 30)
self.btn.move(220, 220)
self.btn.clicked.connect(self.clickfunc)
def clickfunc(self):
self.num += 1
self.label.setText("QLabel显示数字为{}".format(self.num))
if __name__ == '__main__':
app = QApplication(sys.argv)
mywidget = MyWidget()
mywidget.show()
sys.exit(app.exec_())
运行结果如下:
简单分析源代码。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton,QLabel
因为需要增加标签和按钮,所以我们引入了QLabel和QPushButton类
class MyWidget(QWidget):
def __init__(self):
super().__init__()
...
在这里继承了QWidget这个基类,并自定义了一个名为MyWidget的新类,同时对这个MyWidget的新类进行了继承于父类的初始化。
self.label = QLabel("QLabel显示数字为{}".format(self.num), self)
self.label.move(180, 50)
创建一个标签label。该label是QLabel类的一个实例。构造函数的第一个参数是标签文本内容。第二个参数是父窗口小部件。父窗口小部件是示例窗口小部件,它是通过QWidget继承的。
self.btn = QPushButton('button', self)
self.btn.resize(70, 30)
self.btn.move(220, 220)
self.btn.clicked.connect(self.clickfunc)
创建一个按钮btn。该按钮是QPushButton类的一个实例。构造函数的第一个参数是按钮文本内容。第二个参数是父窗口小部件。父窗口小部件是示例窗口小部件,它是通过QWidget继承的。
PyQt5中的事件处理系统采用信号和槽机制构建。 如果我们点击按钮,点击的信号被发出。 槽可以是Qt槽函数或任何Python可调用的函数。 通信在两个对象之间完成:发送方和接收方。 发送方是按钮,接收者是应用对象。该程序中信号为按钮的点击动作,槽函数为自定义的clickfunc()函数(应注意绑定时,只需要写明函数名,而不要括号)。
这里大家看不懂没有关系,信号和槽机制很重要,可以说是PyQt5图形界面编程中十分重要的概念,我们会后面单独花费一章来讲解。
def clickfunc(self):
self.num += 1
self.label.setText("QLabel显示数字为{}".format(self.num))
clickfunc()函数,实现label的显示内容更改