想用PyQt5写GUI,但是网上的PyQt5资源太少了,找到一个英文的,翻译一下,和学习PyQt5的同学共勉!
(本系列中所有代码在windows7 64位[]/Python 3.4.3 32bit/PyQt GPL v5.5 for Python v3.4 (x32)/eric6-6.0.8下测试通过.)
原本地址:http://zetcode.com/gui/pyqt5/
================================================================================
在这部分,我们学习一些基本功能.
这是一个简单的例子,它显示一个小窗口.我们可以对这个窗口做很多事情,我们可以调整它的大小,最大化它或最小化它.这需要很多代码.但是已经有人编写了这个功能.因为它在绝大多数的应用中重复出现,因此没有必要重复的编写它.PyQt5是高级工具集.如果我们把它当作一个低级工具集,那么下面的代码例子可能要有几百行.
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 = QApplication(sys.argv)
每一个PyQt5应用都必须创建一个应用对象.sys.argv参数是来自命令行的参数列表.Python脚本可以从shell里运行.这是我们如何控制我们的脚本运行的一种方法.
w = QWidget()
QWidget窗口是PyQt5中所有用户界口对象的基本类.我们使用了QWidget默认的构造器.默认的构造器没有父类.一个没有父类的窗口被称为一个window.
w.resize(250, 150)
resize()方法调整了窗口的大小.被调整为250像素宽和150像素高.
w.move(300, 300)
move()方法移动了窗口到屏幕坐标x=300, y=300的位置.
w.setWindowTitle('Simple')
在这里我们设置了窗口的标题.标题会被显示在标题栏上.
w.show()
show()方法将窗口显示在屏幕上.一个窗口是先在内存中被创建,然后显示在屏幕上的.
sys.exit(app.exec_())
最后,我们进入应用的主循环.事件处理从这里开始.主循环从窗口系统接收事件,分派它们到应用窗口.如果我们调用了exit()方法或者主窗口被销毁,则主循环结束.sys.exit()方法确保一个完整的退出.环境变量会被通知应用是如何结束的.
exec_()方法是有一个下划线的.这是因为exec在Python中是关键字.因此,用exec_()代替.
图片:简单的例子
一个应用图标是一个用于显示在标题栏最左上角的小图像.在下面的例子中我们会在PyQt5中演示,同时我们还会介绍一个新的方法.
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里的编程意味着是OOP的.
class Example(QWidget):
def __init__(self):
super().__init__()
...
在面向对象编程中重要的是类、数据和方法.在这里,我们创建了一个叫Example的新类.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_())
图片:图标
我们可以为我们的任何一个窗体提供悬浮帮助信息.
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 QWidget widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a QPushButton 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))
这个静态方法设置了一种字体用于绘制提示信息.我们使用了10像素的SansSerif字体.
self.setToolTip('This is a QWidget widget')
要创建一个提示信息,我们要调用setTooltip()方法.我们可以直接用多格式文件来格式化它.
btn = QPushButton('Button', self)
btn.setToolTip('This is a QPushButton widget')
我们创建一个点击按钮并给它设置一个提示信息.
btn.resize(btn.sizeHint())
btn.move(50, 50)
这是用于把按钮定义大小和在窗体位置的.sizeHint()方法会给按钮一个推荐的大小.
图片:提示信息
最明显的关闭一个窗口是点击标题栏上的x.在下个例子中,我们会显示如何以编程的方式去关闭我们的窗口.我们会接触一点信号和槽.
下面是一个QPushButton部件构造器,我们会用在例子中.
QPushButton(string text, QWidget parent = None)
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)
我们创建一个按钮.按钮是QPushButton类的一个实例.构造器的第一个参数是按钮的标签,第二个参数是父部件类.父部件是Example部件,是从QWidget继承来的.
qbtn.clicked.connect(QCoreApplication.instance().quit)
在PyQt5中的事件处理系统是用信号和槽机制构建起来的.如果我们点击按钮,点击信号就会发出.槽可以是一个Qt槽或任何Python可调用的.QCoreApplication包含了主要的事件循环;它处理并分派所有事件.instance()方法给我们它当前的实例.注意QCoreApplication是用QApplication创建的.点击信息被连接到quit()方法,它会终止程序.通信是在发送者和接收者这两个对象之间完成的.这里的发送者是点击按钮,接收者是程序对象.
图片:退出按钮
在默认情况下,如果我们点击标题栏的x,QWidget会被关闭.有时我们想修改一个默认情况.例如,如果我们在编辑器里有一个被打开的文件,我们做了一些修改.我们会想显示一个消息框来确认操作.
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按钮,我们会接受事件,它会导致部件关闭并终止程序.否则会忽略关闭事件.
图片:消息框
下面的脚本会显示我们如何并一个窗口放到桌面正中间.
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_())
self.center()
这条代码会通过调用自定义的center()方法把窗口放到正中间.
qr = self.frameGeometry()
我们通过这个得到主窗体的矩形说明.这包含任何窗口框架.
cp = QDesktopWidget().availableGeometry().center()
我们算出显示器的屏幕分辨率.通过这个,我们会得到中心点.
qr.moveCenter(cp)
我们的矩形已经有了它的宽和高.现在我们设置矩形的中心点到屏幕的中心.矩形的尺寸没有被修改.
self.move(qr.topLeft())
我们移动程序窗口的左上角到qr矩形的左上角,因此将窗口放到屏幕正中心.
图片:正中心