Gus*_*Gus 5 python events pyqt event-handling pyside
如果我打开一个 Python 解释器并输入以下几行:
from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()
Run Code Online (Sandbox Code Playgroud)
然后出现一个文本输入小部件。当我与口译员互动时,我可以与它互动。如果我附加了任何事件处理程序,它们也会被调用。
如果我这样做import time; time.sleep(10),小部件将无响应 10 秒。
如果我运行app.exec_(),该调用会阻塞,直到我关闭应用程序。
我的问题是:app.exec_()如果小部件已经在响应事件,那么运行的意义何在?有什么不同吗?这是否只是一种防止应用程序关闭同时仍为 Qt 的事件循环提供服务的方法(while True: pass正如我们所理解的那样,会导致事件循环阻塞time.sleep(10))
我还想了解 Qt 在哪里与 CPython 挂钩,允许解释器和 GUI 处于活动状态。我知道 Python 2(可能还有 3?)有一个所谓的PyOS_InputHook机制,大约每秒调用 10 次。IPython 使用它来运行 GUI(需要付出很多努力以每秒 10 次以上的速度处理 GUI 事件)。当我实例化 a 时是否发生了同样的事情QApplication?如果是这样,再一次,打电话有什么意义app.exec_()
当您在交互式会话中使用 PyQt/PySide 时,事件处理会在后台自动设置,允许您直接与对象交互。因此,例如,您可以创建并显示一个窗口,然后在窗口仍然可见时从 python shell 中向其添加其他小部件。但是,此行为特定于交互式会话 - 它只是为了让您可以轻松地进行实验,而无需自己设置事件处理。
根据 PyQt Docs,PyOS_InputHook用于在交互式解释器等待用户输入时处理事件(请参阅:使用 Python Shell 中的 PyQt5) - 并且推测 PySide 也使用了类似的机制。
对于从脚本启动的普通 PyQt/PySide 应用程序,您必须显式调用app.exec_()才能启动事件处理。否则,脚本将在所有代码执行完毕后立即退出(即就像任何其他 python 脚本一样)。
(要更深入地了解 Qt 的事件处理,请参阅:线程、事件、QObjects)。
| 归档时间: |
|
| 查看次数: |
6723 次 |
| 最近记录: |