PyQt5教程 --学习如何创建一个2018年的Python GUI

2018 年 10 月 9 日 Python程序员

本教程展示了如何使用PyQt5来构建Python的桌面应用程序。它涵盖了所有知识,包括在2018年配置PyQt的最佳实践、如何编译你的应用程序并将其分发到其他人的电脑上。你可以使用Windows、Mac或Linux。惟一的先决条件是安装python3(最好是3.5)。


PyQt5是什么?

PyQt是一个库,它允许你使用来自Python的Qt GUI框架。Qt本身是用C++编写。在Python中使用它,你可以更快地构建应用程序,而不会牺牲C++的大部分运行速度。

PyQt5指的是Qt的最新的5版本,你可能仍然会在网上见到(Py)Qt4,但它已经过时了,不再受支持了。

PyQt的一个有趣的新竞争者是Python的Qt。它们的API实际上是相同的。与PyQt不同的是,Qt for Python是在LGPL下获得许可的,因此可以在商业项目中免费使用。不利的一面是,它并不成熟。我们在本教程中使用PyQt是因为它更稳定。然而,由于Python的Qt API非常相似,所以你可以很容易地将应用程序相互切换。


安装PyQt

在Python中管理依赖性的最好方法是通过虚拟环境。虚拟环境仅仅是一个本地目录,其中包含特定项目的库。与在系统范围安装这些库不同,那样做将会影响到你的所有项目。

要在当前目录中创建虚拟环境,请执行以下命令:

这就创建了venv/ 文件夹。要激活Windows上的虚拟环境,运行:

在Mac和Linux上,使用:

你以看到,虚拟环境是通过shell中的(venv)前缀激活的:

现在安装PyQt,发出以下命令:

我们使用版本 5.9.2 是因为不是所有(Py)Qt版本都是一样稳定的。但是这个版本肯定是没问题。先不要管其他了——首先要恭喜一下!你已经成功地配置了PyQt5。

创建一个图形用户界面

是时候编写我们的第一个GUI应用了!在虚拟环境仍然活跃的情况下,启动Python。我们将执行以下命令:

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

接下来,我们使用以下命令创建QApplication

这是Qt的一个要求:每个GUI应用程序都必须有一个QApplication的实例。在执行上述命令之前,Qt的部分功能是不起作用的。因此,几乎每一个你写的(Py)Qt应用中都需要用到它。

上面一行的 [] 括号表示传递给应用程序的命令行参数。因为我们的应用程序不使用任何参数,所以我们把括号留空。

现在,为了真正看到一些东西,我们创建了一个简单的标签:

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

根据你的操作系统,这时应该已经打开了一个小窗口:

最后一步是将控制权交给Qt,并要求它“运行应用程序,直到用户关闭它”。这是通过以下命令完成的:

 如果所有这些都像预期的那样工作,那就做得非常好了!你刚刚用Python和Qt构建了第一个GUI应用程序


微件

你在(Py)Qt应用程序中看到的一切都是一个微件:按钮、标签、窗口、对话框、进度条等。就像HTML元素一样,微件通常是嵌套的。例如,一个窗口可以包含一个按钮,这个按钮又包含一个标签。

下面的截图显示了最常见的Qt微件:

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

QLabel

QComboBox

QCheckBox

QRadioButton

QPushButton

QTableWidget

QLineEdit

QSlider

QProgressBar


布局

与上面的例子一样,你的GUI很可能由多个微件组成。在这种情况下,你需要告诉Qt如何定位它们。例如,你可以使用QVBoxLayout垂直地堆叠微件:

这张截图的代码是:

和通常一样,我们先实例化一个QApplication。然后,我们创建一个窗口。我们使用最基本的QWidget ,因为它仅仅是充当一个容器,我们不希望它有任何特殊的行为。接下来,我们创建布局并向其添加两个QPushButtons。最后,我们告诉窗口使用这个布局(及其内容)。在我们的第一个应用程序中,我们结束了对.show()app.exec_()的调用。

当然也有很多其他类型的布局(例如QHBoxLayout可以在一行中列出项目)。请参阅Qt的文档概述。


自定义样式

Qt的优势之一是它对定制样式的支持。有许多机制可以让你自定义应用程序的外观和感觉。本节概述了一些。


内置的样式

改变应用程序外观的最粗略的方法是设置全局样式。回想一下上面的微件截图:

它使用了一种称为Fusion的样式。如果你使用的是Windows 风格,那么它看起来是这样的:

要应用样式,请使用 app.setStyle(...)

可用的样式取决于你的操作系统,但通常是"Fusion" "Windows" "WindowsVista"(仅Windows)和"Macintosh" (仅Mac


自定义颜色

如果你喜欢一种样式,但想要改变它的颜色(例如 对一个黑暗主题),您可以使用QPalette app.setPalette(...)。例如:

这将把按钮的文本颜色更改为红色:

对于Fusion样式的黑色主题,请看这里。


样式表

除此之外,您还可以通过样式表更改应用程序的外观。这是Qt的CSS类比。比如,我们可以这样来增加一些间距:

有关样式表的更多信息,请参阅Qt的文档。


信号/插槽

Qt使用一种称为信号的机制,让你对诸如用户单击按钮之类的事件作出反应。下面的例子说明了这一点。它包含一个按钮,被点击时,它会显示一个消息框:

上文高亮显示的这条线很有趣:button.clicked是一个信号,.connect(...)让我们在它上面安装一个被称作插槽的东西。这只是一个在信号发生时被调用的函数。在上面的例子中,我们的插槽显示了一个消息框。

在使用C++时,术语“插槽”是很重要的,因为插槽必须以一种特殊的方式在C++中声明。然而,在Python中,任何函数都可以是一个插槽——我们已经在上面见识到了。由于这个原因,插槽和“正常”功能之间的区别与我们没有什么关系。

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


编译你的应用程序

现在你已经掌握了创建一个响应用户输入的GUI的基本知识。假设你写了一个应用程序,它可以在你的电脑上运行。但是你要如何把它给别人,而且同样也能运行?

你可以让你的用户像我们上面做的那样安装Python和PyQt,然后给他们你的源代码。但这样非常令人不爽(而且通常是不切实际的)。我们想要的是应用的独立版本,也就是说,一个二进制可执行文件,其他人可以在他们的系统上运行,并且不需要安装任何东西。

在Python世界中,将源代码转换成一个独立的可执行文件的过程被称为冻结。尽管有许多库解决了这个问题——比如PyInstaller、py2exe、cx_Freeze, bbfreze, py2app 等等——传统上,冻结PyQt应用一直是一个令人惊讶的难题。

我们将使用一个叫做fbs的新库,它允许你为PyQt应用程序创建独立的可执行文件。要安装它,请输入以下命令:

 然后,执行以下操作:

 这里提示你有一些值:

在你输入run命令后,会打开一个空窗口:

这是一个和我们之前所见完全一样的PyQt5应用。它的源代码在你的当前文件目录下的src/main/python/main.py  中。但这里有一个很酷的设计:我们可以使用fbs将其转换为独立的可执行文件!

这命令会在你的当前文件目录的target/MyApp/文件夹中放置一个自包含的二进制文件。现在,你可以把它发送给你的朋友(必须是和你一样的操作系统),这样他们就可以运行你的应用了!

(请注意,fbs目前的目标是Python 3.5。如果你有一个不同的版本,而且无法正常运行的话,请安装Python 3.5并再次尝试。在macOS上,你还可以安装Python 3.5和Homebrew。)


额外:创建一个安装程序

fbs还允许你通过命令

为你的应用创建一个安装程序:

有关如何为现有应用程序使用fbs的更多信息,请参阅本文。或是fbs的教程。


最后总结

如果你已经成功进行到这里的话,那么大大的恭喜你。希望你现在已经很好地了解PyQt(以及它的各个部分),学会使用Python编写桌面应用程序。我们还看到了fbs如何协助你创建独立的可执行程序和安装程序。

如果你对本教程有任何问题或反馈,欢迎随时给我发邮件。尽情享受编写应用程序带来的乐趣吧!


英文原文:https://build-system.fman.io/pyqt5-tutorial
译者:任宇は神様


登录查看更多
2

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
340+阅读 · 2020年3月17日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
180+阅读 · 2020年1月1日
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
TensorFlow神经网络教程
Python程序员
4+阅读 · 2017年12月4日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
干货|7步让你从零开始掌握Python机器学习!
全球人工智能
8+阅读 · 2017年9月24日
利用python操作Excel教程
Python技术博文
4+阅读 · 2017年9月13日
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Question Generation by Transformers
Arxiv
5+阅读 · 2019年9月14日
Universal Transformers
Arxiv
5+阅读 · 2019年3月5日
Star-Transformer
Arxiv
5+阅读 · 2019年2月28日
Arxiv
3+阅读 · 2018年6月19日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
194+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
【干货书】机器学习Python实战教程,366页pdf
专知会员服务
340+阅读 · 2020年3月17日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
180+阅读 · 2020年1月1日
相关资讯
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
TensorFlow神经网络教程
Python程序员
4+阅读 · 2017年12月4日
Python NLP 入门教程
开源中国
14+阅读 · 2017年10月1日
干货|7步让你从零开始掌握Python机器学习!
全球人工智能
8+阅读 · 2017年9月24日
利用python操作Excel教程
Python技术博文
4+阅读 · 2017年9月13日
相关论文
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Question Generation by Transformers
Arxiv
5+阅读 · 2019年9月14日
Universal Transformers
Arxiv
5+阅读 · 2019年3月5日
Star-Transformer
Arxiv
5+阅读 · 2019年2月28日
Arxiv
3+阅读 · 2018年6月19日
Top
微信扫码咨询专知VIP会员