终于知道这个app.exec_()是啥意思了


私早先就说过,私比较习惯自己尝试、研究,是很看不进参考书的。Python的手册看过一部分,后来发现对私相当晦涩,所以后来也直接找教程,不怎么看官方手册了。

PyQt的手册看得更少。不过那倒不是因为私没心思看,而是面对一套新概念、新名词,英语再好也未必真的看明白,于是找到了《The PyQt4 tutorial》。这本书虽然例子都很简洁,但似乎不像是为图形编程的初学者写的,对于某些基本的东西说得非常模糊,比如这段必加内容:

app=QtGui.QApplication()
==若干代码……==
sys.exit(app.exec_())

第一行是说要建立一个“应用程序”,虽然私没搞明白为什么它不会自动创建,不过好歹算是理解了。但最后一行那个对app进行的exec_()方法却怎么也无法理解。手册里倒是解释了sys.exit(),这本来是Python的方法,还会有人看不明白么?真正让人搞不懂的是那个exec_(),而这本指导对此的作用则只字未提。当时私还对PyQt不熟悉,那么多的类那么多的函数与方法,连手册都无从查起,只能照葫芦画瓢写。

后来终于是琢磨明白了。这个app不是什么内置变量,而是代码第一行里面人为定义的一个QApplication的实例,也就是说“app”这个名字是随便起的。那么app.exec_()就该是QApplication的方法,于是乎去查手册。原来这个exec_()方法的作用是“进入程序的主循环直到exit()被调用”,说白了就是让这个程序运行。

在这方面PyQt和Python有个很大的不同。虽然Python的一切也需要调用才能生效,但是一旦被调用就会立即有反应。PyQt则是类和对象的层层嵌套,需要你逐层调用。私以前一直以为读过“show()”这个方法之后就会有窗口显示在屏幕上,其实真正让窗口显示出来的并不是这一句,这一句其实是个界定窗口在何时弹出的“声明”,解释器读取到这里,Application还没有启动,只是确定了一旦启动,应该在“这个时候”弹出这个窗口。真正让整个程序运转的是“sys.exit(app.exec_())”里面嵌套的这个“app.exec_()”,而正是因为这个嵌套,让私一直误以为这个app.exec_()是一个跟退出“直接相关”(当然它们确实也相关)的方法,以至于百思不得其解。

说到底还是自己学艺不精。看来以后还是要多看手册,光凭教程和自己的一点理解是远远不够的。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s