PyQt5 2018最新教程

本教程将会教你如何使用PyQt5来制作一个Python桌面应用desktop app。本教程涵括所有内容 - 从配置PyQt的最好方法到编译你的应用并且发布应用供他人使用。你可以使用Windows、Mac或者Linux系统。前提是你需要先安装了Python3.5+ 版本。

PyQt5是什么呢?

PyQt是一个Python的第三方库,它能够让你使用QT图形用户界面框架Qt GUI framework。Qt本身是使用C++编程语言编写的。在Python中使用它,可以让你更快的构建一个应用,并且不会影响C++的速度。

PyQt5是指最新的Qt的第5个版本。你可能依然时常能看到关于(Py)Qt4的信息,不过这个版本已经很老了,并且已经不被官方支持了。

PyQt其中一个有趣的新竞争对手是Qt for Python。它们的API基本是相同的。和PyQt不同的是,它是使用的是LGPLGNU宽通用公共许可证 ,也就是说可以在商业项目中免费使用。它是由Qt公司支持的,所以很可能它就是未来。我们在本教程使用PyQt是因为它更为成熟。因为这些API是基本相同的,之后你可以很轻松的转移到Qt for Python。

安装 PyQt

在Python中管理依赖项dependencies最好的方法就是通过虚拟环境virtual environment 。虚拟环境其实就是一个本地的文件夹,里面包括一个特定项目所需要的库libraries。虚拟环境的库和系统全局安装的库相比,全局的库会影响你其他所有项目。

 

要在当前文件夹生成一个虚拟环境,执行以下命令:

python3 -m venv venv

这条命令会创建一个venv文件夹。要在Windows系统激活这个虚拟环境,运行以下命令:

call venv/scripts/activate.bat

在Mac或者Linux系统,使用以下命令:

source venv/bin/activate

当你看到命令行中有个(venv)前缀时就是成功的激活这个虚拟环境了:

现在我们要安装PyQt,执行以下命令:

pip install PyQt5==5.9.2

我们使用5.9.2版本的原因是因为不是所有的(Py)Qt发行版都是稳定的。而这个版本能保证没问题。除了这个细微差别 - 恭喜你!你已经成功的安装好PyQt5了。

创建一个图形用户界面

现在就开始创建我们的一个图形用户界面应用吧!趁着虚拟环境还处于激活状态,启动Python。我们将执行以下命令:

首先,我们告诉Python通过import语句加载PyQt库:

from PyQt5.QtWidgets import QApplication, QLabel
Next, we create a QApplication with the command:
​
app = QApplication([])

这是一个Qt的要求:每一个图形用户界面应用必须要有一个具体的QApplication实例 instance。只有你执行了以上那一行代码,Qt大部分组件才会起作用。因此,你写的每一个(Py)Qt应用都需要包括它。

上面那行代码中的中括号 brackets  [ ] 代表给应用传递了命令行参数。因为我们的应用并没有使用任何参数,所以中括号留空。

Talk is cheap, show me the code,让我们来创建一个简单的标签 label:

label = QLabel('Hello World!')

然后,我们告诉Qt在屏幕上显示这个标签:

label.show()

这取决于你的操作系统,一个小小的窗口已经出现在你眼前:

最后一步就是将这个组件传递给Qt,并让它“一直运行这个应用,除非用户手动关闭它”。这个是通过以下命令实现:

app.exec_()

如果以上都如预期的一样,那么恭喜你!你刚刚成功的使用Python和Qt构建了你的第一个图形用户界面应用!

部件

你在一个(Py)Qt 应用看到的所有东西都是一个部件 widget:按钮、标签、窗口、对话框、进度条 Buttons, labels, windows, dialogs, progress bars等等。就像HTML元素一样,部件也是经常内嵌的。例如,一个窗口可以包括按钮,相应的,这个按钮也能包括一个标签。

 

以下截图展示了一些Qt最常用的部件:

从上到下,从左到右,它们是:

布局

像上面那个例子一样,你的图形用户界面应用可能会由多个不同的部件组成。这种情况下,你需要告诉Qt如何去排序这些部件。比如,你可以使用QTableWidget水平方向的摆放你的部件:

实现以这个截图的代码为:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
layout.addWidget(QPushButton('Top'))
layout.addWidget(QPushButton('Bottom'))
window.setLayout(layout)
window.show()
app.exec_()

像之前一样,我们先实例化了一个QApplication。然后,我们创建了一个窗口 window。我们使用了最基本的QWidget 因为它仅仅是作为一个容器 container,而且我们也不想让它包含任何特殊的行为。接下来,我们创建一个布局 layout并且给它添加两个QPushButton 。最后,我们告诉窗口 window去使用这个布局 layout(因此也包括它的内容)。像我们的第一个应用一样,我们需要在结尾调用.show()app.exec_()方法。

当然了,Qt中还有很多其他的布局类型(例如使用QHBoxLayout将内容摆放在一行row中)。查看官方Qt's documentation 了解更多内容。

自定义样式

Qt其中的一个特色就是支持自定义样式 custom styles。在Qt有很多种方法可以让你自定义应用的外观和感觉 look and feel,这个部分总结了一些。

内置样式

修改应用外观最简单粗暴的方法就是直接设置全局样式。来看看之前的那张截图:

这个使用了名为Fusion的样式。如果你使用window样式,你会看到以下这个样子:

要应用一个样式,你需要使用app.setStyle(...)

from PyQt5.QtWidgets import *
app = QApplication([])
app.setStyle('Fusion')
...

有多少可用的样式,这取决以你的操作系统。不过一般Windows操作系统才有FusionWindowsWindowsVista以及Mac操作系统才有 Macintosh

自定义颜色

如果你喜欢一个样式,但是想要修改它的颜色(例如修改成黑色主题),那么你可以使用 QPaletteapp.setPalette(...),例如:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QPushButton
​
app = QApplication([])
app.setStyle('Fusion')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.red)
app.setPalette(palette)
button = QPushButton('Hello World')
button.show()
app.exec_()

它会将按钮中的文字颜色改成红色:

要修改成黑色的Fusion样式,代码如下:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette,QColor
from PyQt5.QtWidgets import QApplication, QPushButton
​
app = QApplication([])
app.setStyle('Fusion')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.red)
app.setPalette(palette)
button = QPushButton('Hello World')
​
​
app.setStyle("Fusion")
​
dark_palette = QPalette()
​
dark_palette.setColor(QPalette.Window, QColor(53, 53, 53))
dark_palette.setColor(QPalette.WindowText, Qt.white)
dark_palette.setColor(QPalette.Base, QColor(25, 25, 25))
dark_palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
dark_palette.setColor(QPalette.ToolTipBase, Qt.white)
dark_palette.setColor(QPalette.ToolTipText, Qt.white)
dark_palette.setColor(QPalette.Text, Qt.white)
dark_palette.setColor(QPalette.Button, QColor(53, 53, 53))
dark_palette.setColor(QPalette.ButtonText, Qt.white)
dark_palette.setColor(QPalette.BrightText, Qt.red)
dark_palette.setColor(QPalette.Link, QColor(42, 130, 218))
dark_palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
dark_palette.setColor(QPalette.HighlightedText, Qt.black)
​
app.setPalette(dark_palette)
​
app.setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }")
​
button.show()
app.exec_()

运行后,你将看到以下内容:

 

注意,这个黑色的主题的代码原本是放在作者的github上面的https://gist.github.com/mstuttgart/37c0e6d8f67a0611674e08294f3daef7。译者将其复制出来,并运行后生成截图。所以你们看到的这个窗口样式和之前的不一样是因为译者用的是windows10系统,与作者用的Mac不同。(相比Mac和Linux,windows10确实没那么好看)

样式表

除了以上那个方法,你还可以通过样式表 style sheets来修改应用的外观。这与CSS差不多。我们可以在以下例子中使用它来添加一些间距spacing。

from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_()

要查看更多关于样式表 style sheets的内容,你可以访问官网 Qt's documentation

信号和槽

Qt使用了一个机制叫做信号signals让你可以对事件进行处理,例如用户点击一个按钮。我们用以下列子进行解释。这个例子里面有一个按钮,当按钮被点击的时候,将会弹出一个消息框message box。

from PyQt5.QtWidgets import *
app = QApplication([])
button = QPushButton('Click')
def on_button_clicked():
    alert = QMessageBox()
    alert.setText('You clicked the button!')
    alert.exec_()
​
button.clicked.connect(on_button_clicked)
button.show()
app.exec_()

button.clicked是一个信号,.connect(...)让我们给它安装了一个所谓的槽slot。这仅仅是一个函数,当信号出现时就会被调用。以上例子中,我们的槽slot显示了一个消息框message box。

当在C++使用Qt时,槽slot是非常重要的,因为槽slot必须使用特殊的方法在C++中声明。然而在Python中,任何函数都可以作为一个槽slot - 例如以上这个例子。根据这个,槽slot和“普通”函数对我们来说还是有一点关联的。

在Qt中,信号signals是无处不在的。当然你可以定义自己的信号signals。不过这个已然超出了本教程的范围。

编译你的应用

目前为止,我相信你已经对如何创建一个图形用户界面应用和如何回应用户的输入有了一定的了解。假如你已经写了一个应用,它运行在你的电脑上,你要如何把这个应用给到其他人使用呢?

你可能会告诉这些人像我们上面所做的一样去安装Python和PyQt,然后将源代码给他们。但是这样做会非常无趣(而且也有点不切实际)。我们想要的是一个独立的standalone、可执行的二进制binary executable应用。这样其他人就能够在不安装的情况下,直接在他们的操作系统运行。

在Python的世界中,将源代码转换成一个可执行的二进制文件称为打包freezing。虽然有很多库可以用来解决这个问题,例如有PyInstaller, py2exe, cx_Freeze, bbfreze, py2app等待。但是打包PyQt应用一直以来都是一个特别麻烦的问题。

我们将会使用一个名为fbs的库,它能够让你创建一个独立可执行的PyQt应用。命令行输入以下内容安装它:

pip install fbs PyInstaller==3.3.1

然后执行以下命令:

python3 -m fbs startproject

它将会提示你输入一些值:

当你在输入了建议运行的命令python -m fbs run,一个空白的窗口应该会被打开:

这个QpQt5应用就像是我们先前见到的哪些一样。它的源码在你当前文件夹的 src/main/python/main.py中。但是,这里有一个很酷的地方:我们可以使用fbs将它转成独立可执行的二进制文件!

python3 -m fbs freeze

运行这行命令后,在你当前文件夹的这个路径target/MyApp/中将会生成一个二进制文件。你可以将它发给你的朋友(使用同样的操作系统),他们就能够运行你的应用了!

福利:创建一个安装器

fbs也能够让你通过python3 -m fbs installer为应用创建一个安装器:

查看更多关于使用fbs的信息,可以查看该文章https://build-system.fman.io/pyqt-exe-creation/或者这个fbs教程https://github.com/mherrmann/fbs-tutorial

总结

如果你已经看到了这里,那么恭喜你!希望你现在已经明白如何使用Python的PyQt(和其不同的内容)来构建一个桌面应用。我们也一起了解了如何使用fbs来创建一个独立的可执行二进制文件和安装器。

 

原文作者的自我介绍

大家好!我是Michael。我最初是在奥地利的维也纳,后来去了英国学习并获得了牛津大学的理学硕士MSc。回到维也纳后,我现在开发和销售软件服务,大多是通过互联网。

查看更多原文作者信息,访问http://www.herrmann.io/

 

本文译者公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值