Python QT5 简洁入门

以下内容翻译自https://build-system.fman.io/pyqt5-tutorial,有删减。

我们先看下面一个简单的GUI代码:

from PyQt5.QtWidgets import QApplication, QLabel

app = QApplication([])
label = QLabel('Hello World!')
label.show()
app.exec_()

第一行是导入相关的QT相关的库。

接着第二行是通过创建了一个QApplication:

app = QApplication([])

这是必须要创建的一个对象。每个GUI程序都必须有且只有一个QApplication的实例。如果没有这个实例的话,我们写的QT是没法执行的,所以我们写QT代码的时候一定不要忘了创建这个对象。 创建这个对象时需要传递一个list参数,因为我们的GUI不需要什么参数,所以直接传递了一个[]

在创建了app之后,我们又创建了一个Label(标签):

label = QLabel('Hello World!')

传递的参数就是标签显示的内容,然后通过调用show()方法让它在屏幕上显示。

最后的一行代码是告诉qt一直运行下去,直到有人关闭它。

完成上述工作之后,执行代码,我们的一个小小窗口就会显示在屏幕上:

QVBoxLayout example

Widgets

我们在Qt程序中看到的每个东西都可以称之为一个widget:按钮,标签,窗口,对话框,程序的进度条等等。与HTML元素类似,widget一般也都是嵌入式的。举个例子,一个窗口包含了一个按钮,同时也可能包含了一个标签。

下面的截图展示了QT中常用的widget。

Screenshot of common Qt widgets using the Fusion style

从上到下,从左到右,这些widget依次是:

Layouts

正如上面的截图所示,我们的GUI中可能包含了多个widgets。在这种情况下,我们需要告诉QT如何安放这些widgets。例如。我们可以使用QVBoxLayout垂直堆放widget:

QVBoxLayout example

这个截图的代码如下:

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。我们使用的是最基本的QWdiget,因为它只是一个容器,用来放置widget,我们并不需要它有什么特殊的功能。然后,我们就创建了一个layout,还创建了两个QPushButton放在里面。最后,我们告诉了window,我们需要使用这个layout。然后就跟我们的第一个GUI一样,调用show()exec_()

当然还有很多其他的layout,例如QHBoxLayOut等等。更多的风格,可以在qt的网站上查阅

自定义风格

QT一个比较强大的地方就是它支持自定义的用户风格。

风格设置

比较直接的设置方式就是在我们的程序中直接指定全局的风格。我们再看看之前的截图:

Screenshot of common Qt widgets using the Fusion style

上面的这个窗口风格称之为Flusion,我们也可以把他替换成Windows风格:

Screenshot of common Qt widgets using the Windows style

通过qpp.setStyle(...)方法,我们就可以设置自己的风格了。

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

具体支持什么样的风格依赖于我们使用的操作系统,但是一般都支持以下的风格:'Fusion', 'Windows', 'WindowsVista'(仅Windows支持) and 'Macintosh' (仅Mac支持)

自定义颜色

如果我们喜欢一种风格,但是我们想改变一些颜色。那么我们就可以使用QPalette来实现我们的功能。例如:

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_()

执行效果如下:

Screenshot of a QPushButton with red text in the Fusion style

面板风格

除了上述的功能之外,我们还可以通过面板风格来改变我们程序的外观。这就是QT类似于CSS的特性。我们可以通过以下的方法我们的面板添加一些空间:

from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_()
Qt window with a button surrounded by extra space

更多关于面板风格的信息,可以查看qt官网。

Signals / slots

QT 通过Signals(信号)机制来让我们对一些事件做响应,例如我们点击了一个按钮。下面的这个例子就是当我们点击按钮时,会弹出对话框。

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_()
PyQt QMessageBox saying that a button was clicked

button.clicked这就是个signal(信号),.connect(...)就是我们指定的与这个signal关联的slot(槽)。上面这是一个简单的响应函数,当我们点击这个按钮的时候,这个动作(函数)就会触发。

Signals在QT中是无处不在的,用户也可以定义自己的signal。

编译属于自己的APP

现在我们已经有了一点关于GUI的基本知识了。但是当我们写好一个程序之后,如何给别人使用呢?让别人搭建环境,然后再把脚本给人家吗?这肯定是不合理的,所以我们该怎么做呢?

在python的世界中,将源码转换成一个可执行的,这种操作称之为freezing。尽管现在已经有很多的库都可以解决这个问题,例如:PyInstaller ,py2exe,cx_Freeze,bbfreze,py2app...但是这些传统的库用来freezing一个PyQt程序还是有点难度的。

这里我们使用一个全新的fbs库,它可以让我们轻易的将python源码转换成一个执行的PyQt程序。安装fbs也很简单,执行下面的命令就OK了:

pip install fbs

接着执行:

fbs startproject

然后你就会看到下面的提示:

Commands for starting a new project with fbs

当你输入run之后,就会打开一个空的窗口:

An empty window showing 'Hello World!' in its title

这就跟我们之前创建的一个qt程序相似。它会在我们的当前目录下创建一个文件src/main/python/main.py,然后我们可以试着把它编程一个可执行的文件。

fbs freeze

这个命令就在你当前的目录的target/MyApp/子目录有了一个可执行的文件。然后我们就可以把它发送给别人了。

(注意:fbs现在支持Python 3.5 或者 3.6,如果你的版本不是二者之一,同时你的fbs还出现了问题,建议你安装Python 3.6再试试。)

小奖励![img]:创建一个安装包

通过fbs installer命令我们还可以创建安装包。

img
img

(如果你使用的Windows系统,那么你需要先安装NSIS,然后配置好环境变量)

线面的一篇文章说明了如何使用fbs,另外你也可以看看fbs教程

文章

fbs 教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容