原文: http://zetcode.com/gui/pyqt5/firstprograms/python
在这部分教程中咱们将学习PyQt5的一些基本功能web
这是一个只显示一个小窗口的简单示例。但咱们能够对这个窗口进行一些操做,如调整尺寸,最大化或最小化。这须要编写不少代码,但有人已经完成了这个功能。由于它在多种程序中的通用性,因此再也不须要重复编码。PyQt5是一个高级工具集。若是咱们使用较低级的工具集进行编码,要实现这个功能最少也要上百行代码。shell
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial In this example, we create a simple window in PyQt5. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == '__main__': app = QApplication(sys.argv) w = QWidget() w.resize(250, 150) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())
上面的代码会在屏幕上显示一个小窗体。编程
import sys from PyQt5.QtWidgets import QApplication, QWidget
在这里咱们导入了必要的模块。这些基本控件位于PyQt5.QtWidgets模块中。app
app = QApplication(sys.argv)
每一个PyQt5应用程序都须要建立一个application对象。sys.argv是从命令行传入的参数列表。Python脚本能够从shell中运行。这是一种控制脚本启动的方式。编辑器
w = QWidget()
控件QWidget是QtPy5中全部UI对象的基类。咱们调用了QWidget的默认构造器。默认构造器没有parent参数。没有parent的控件称为窗体(window)。工具
w.resize(250, 150)
resize()方法用于设置控件的尺寸。它宽250px高150px。学习
w.move(300, 300)
move()方法将控件移动到坐标为x=300, y=300的位置字体
w.setWindowTitle('Simple')
这里设置了窗体的标题。标题在标题栏中显示。ui
w.show()
show()方法将控件显示在屏幕上。控件要先在内存中建立,而后在屏幕上显示。
sys.exit(app.exec_())
最后咱们进入了application的主循环。事件处理从这里开始。主循环从窗体系统中接收事件,并将事件分发给控件。在调用exit()方法或主控件销毁时主循环会中止。sys.exit()方法确保能够干净地退出。系统能够感知到程序是如何退出的。
注意exec_()
方法的下划线。因为exec是python中的关键字,因此使用exec_()。
程序的图标是显示在标题栏左上角的一个小图像。接下来咱们将介绍如何用PyQt5实现,这会用到一些新的API。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows an icon in the titlebar of the window. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png')) self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
以前的示例采用了过程式编码风格。Python语言支持过程式与面向对象的编程风格。PyQt5采用了面向对象编程。
class Example(QWidget): def __init__(self): super().__init__() ...
在面向对象编程中有三个要素:类,数据与方法。咱们建立了一个Example
类,它继承自QWidget
。这就意味着咱们要调用两个构造器:首先是Example
类的,而后是被继承的类的。super()
方法返回了Example
的父对象,而且咱们调用了它的构造器。__init__()
方法是Python语言中的构造器。
self.initUI()
GUI的建立交给了initUI()方法。
self.setGeometry(300, 300, 300, 220) self.setWindowTitle('Icon') self.setWindowIcon(QIcon('web.png'))
这三个方法继承自QWidget
类。setGeometry()
设置了控件的位置与尺寸。前两个参数是窗体的x,y坐标,第三个与第四个参数设置了窗体的宽度与高度。实际上它合并了resize()
与move()
方法。最后一个方法设置了应用的图标。咱们须要建立一个QIcon对象,QIcon
接受要显示的图标的路径做为参数。
if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在这里建立了application与example对象,而且启动了主循环。
咱们能够为全部控件添加消息提示框。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This example shows a tooltip on a window and a button. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication) from PyQt5.QtGui import QFont class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): QToolTip.setFont(QFont('SansSerif', 10)) self.setToolTip('This is a <b>QWidget</b> widget') btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget') btn.resize(btn.sizeHint()) btn.move(50, 50) self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Tooltips') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在这个例子中咱们为两个PyQt5控件添加了提示消息。
QToolTip.setFont(QFont('SansSerif', 10))
这个静态方法为tooltip设置了10px的Sanserif字体。
self.setToolTip('This is a <b>QWidget</b> widget')
咱们调用setToolTip()
方法为控件建立提示消息。消息可使用富文本格式。
btn = QPushButton('Button', self) btn.setToolTip('This is a <b>QPushButton</b> widget')
这里咱们建立了一个PushButton并为它设置了一个富文本提示消息。
btn.resize(btn.sizeHint()) btn.move(50, 50)
这里设置了button的尺寸,并将其在窗体上移动。sizeHint()
方法为控件返回一个推荐的尺寸。
关闭窗体最明显的方法是点击标题栏上的x
符号。在下面的例子中,我会展现如何经过编程来关闭窗体。这里咱们要涉及到简单的signal和slot(信号槽)。
QPushButton(string text, QWidget parent = None)
这是以前用到的QPushButton控件的构造器。其中text
参数是将要在按钮上显示的文本,parent
表示按钮的父控件,在这个例子中就是QWidget。一个程序的全部控件构成了一个控件树。在这个树上大部分控件都有父控件。没有父控件的控件是顶层窗体。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program creates a quit button. When we press the button, the application terminates. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QWidget, QPushButton, QApplication from PyQt5.QtCore import QCoreApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): qbtn = QPushButton('Quit', self) qbtn.clicked.connect(QCoreApplication.instance().quit) qbtn.resize(qbtn.sizeHint()) qbtn.move(50, 50) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Quit button') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在这个示例中咱们建立了一个退出按钮。程序会在点击了这个按钮时退出。
from PyQt5.QtCore import QCoreApplication
这里咱们我用到QtCore
模块中的一个对象。
qbtn = QPushButton('Quit', self)
咱们建立了一个PushButton, 它是QPushButton
类的实例。构造器的第一个参数是按钮的标签,第二个参数是它的父控件,也就是Example
, 因为继承关系Example
也是QWidget
。
qbtn.clicked.connect(QCoreApplication.instance().quit)
PyQt5中的事件处理系统采用signal&slot(信号槽)机制。当咱们点击按钮时会发出clicked
信号。slot能够是Qt slot或任何Python的callable对象。QCoreApplication
包含了主事件循环;它能够处理并分发事件。instance()
方法返回它的当前实例。QCoreApplication
是由QApplication建立的。clicked信号链接到能够退出程序的quit()方法。这个过程由两个对象完成:发送者与接收者。发送者是PushButton,接收者是QApplication对象。
当咱们点击标题栏上的x按钮时默认会关闭QWidget。但有时咱们想改变这种默认行为。例如,若是咱们在编辑器中打开了一个文件,而且对这个文件作了修改。在关闭前咱们但愿显示一个对话框让用户进行确认。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program shows a confirmation message box when we click on the close button of the application window. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Message box') self.show() def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
在关闭QWidget
时会生成QCloseEvent
。咱们须要从新实现closeEvent()
这个事件处理器来改变控件的行为。
reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
咱们要显示带有两个按钮(Yes和No)的消息对话框。第一个字符串会显示在标题栏,第二个字符串是对话框的消息文本。第三个参数设置了显示在对话框中的按钮。最后那个参数指定了默认的按钮,也就是默认取得键盘焦点的按钮。返回结果保存在reply
变量中。
if reply == QtGui.QMessageBox.Yes: event.accept() else: event.ignore()
咱们在这里对返回值进行匹配。当点击了Yes按钮时,咱们会接受该事件,从而关闭该控件并退出程序;不然就忽略这个关闭事件。
下面的脚本会将窗体置于桌面中心。
#!/usr/bin/python3 # -*- coding: utf-8 -*- """ ZetCode PyQt5 tutorial This program centers a window on the screen. author: Jan Bodnar website: zetcode.com last edited: January 2015 """ import sys from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(250, 150) self.center() self.setWindowTitle('Center') self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
QtGui.QDesktopWidget
提供了关于用户桌面的信息,包括屏幕尺寸。
self.center()
center()方法中包含了窗体居中的代码。
qr = self.frameGeometry()
获得一个指定了主窗体形状的矩形。
cp = QDesktopWidget().availableGeometry().center()
指出显示器的屏幕分辨率并根据分辨率找出屏幕的中心点。
qr.moveCenter(cp)
将矩形移动到屏幕中心,尺寸不变。
self.move(qr.toLeft())
将窗体的左上角移动到矩形qr的左上角,窗体与矩形重合,从而将窗体置于屏幕中心。
在这部分教程中咱们学到了一些PyQt5基础