本教程将会教你如何使用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-mvenv venv
这条命令会创建一个venv文件夹。要在Windows系统激活这个虚拟环境,运行以下命令:
call venv/scripts/activate.bat
在Mac或者Linux系统,使用以下命令:
sourcevenv/bin/activate
当你看到命令行中有个(venv)前缀时就是成功的激活这个虚拟环境了:
现在我们要安装PyQt,执行以下命令:
pip installPyQt5==5.9.2
我们使用5.9.2版本的原因是因为不是所有的(Py)Qt发行版都是稳定的。而这个版本能保证没问题。除了这个细微差别 - 恭喜你!你已经成功的安装好PyQt5了。
创建一个图形用户界面
现在就开始创建我们的一个图形用户界面应用吧!趁着虚拟环境还处于激活状态,启动Python。我们将执行以下命令:
首先,我们告诉Python通过语句加载PyQt库:
fromPyQt5.QtWidgetsimportQApplication,QLabel
# 下一步,我们实例化一个QApplication
app=QApplication([])
这是一个Qt的要求:每一个图形用户界面应用必须要有一个具体的实例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最常用的部件:
从上到下,从左到右,它们是:
QLabel
QComboBox
QCheckBox
QRadioButton
QPushButton
QTableWidget
QLineEdit
QSlider
QProgressBar
布局
像上面那个例子一样,你的图形用户界面应用可能会由多个不同的部件组成。这种情况下,你需要告诉Qt如何去排序这些部件。比如,你可以使用QTableWidget垂直的摆放你的部件:
实现以这个截图的代码为:
fromPyQt5.QtWidgetsimportQApplication,QWidget,QPushButton,QVBoxLayout
app=QApplication([])
window=QWidget()
layout=QVBoxLayout()
layout.addWidget(QPushButton('Top'))
layout.addWidget(QPushButton('Bottom'))
window.setLayout(layout)
window.show()
app.exec_()
像之前一样,我们先实例化了一个。然后,我们创建了一个窗口window。我们使用了最基本的因为它仅仅是作为一个容器container,而且我们也不想让它包含任何特殊的行为。接下来,我们创建一个布局layout并且给它添加两个。最后,我们告诉窗口window去使用这个布局layout(因此也包括它的内容)。像我们的第一个应用一样,我们需要在结尾调用和方法。
当然了,Qt中还有很多其他的布局类型(例如使用QHBoxLayout将内容摆放在一行row中)。查看官方Qt's documentation了解更多内容。
自定义样式
Qt其中的一个特色就是支持自定义样式custom styles。在Qt有很多种方法可以让你自定义应用的外观和感觉look and feel,这个部分总结了一些。
内置样式
修改应用外观最简单粗暴的方法就是直接设置全局样式。来看看之前的那张截图:
这个使用了名为的样式。如果你使用样式,你会看到以下这个样子:
要应用一个样式,你需要使用:
fromPyQt5.QtWidgetsimport*
app=QApplication([])
app.setStyle('Fusion')
...
有多少可用的样式,这取决以你的操作系统。不过一般Windows操作系统才有、、以及Mac操作系统才有。
自定义颜色
如果你喜欢一个样式,但是想要修改它的颜色(例如修改成黑色主题),那么你可以使用QPalette和,例如:
fromPyQt5.QtCoreimportQt
fromPyQt5.QtGuiimportQPalette
fromPyQt5.QtWidgetsimportQApplication,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_()
它会将按钮中的文字颜色改成红色:
要修改成黑色的样式,代码如下:
fromPyQt5.QtCoreimportQt
fromPyQt5.QtGuiimportQPalette,QColor
fromPyQt5.QtWidgetsimportQApplication,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。
fromPyQt5.QtWidgetsimportQApplication,QPushButton
app=QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button=QPushButton('Hello World')
button.show()
app.exec_()
领取专属 10元无门槛券
私享最新 技术干货