本教程展示了如何使用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
,因为它仅仅是充当一个容器,我们不希望它有任何特殊的行为。接下来,我们创建布局并向其添加两个QPushButton
s。最后,我们告诉窗口使用这个布局(及其内容)。在我们的第一个应用程序中,我们结束了对.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
译者:任宇は神様