Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt/PySide事件循环在哪里运行?_Python_Events_Pyqt_Event Handling_Pyside - Fatal编程技术网

Python PyQt/PySide事件循环在哪里运行?

Python PyQt/PySide事件循环在哪里运行?,python,events,pyqt,event-handling,pyside,Python,Events,Pyqt,Event Handling,Pyside,如果打开Python解释器并输入以下行: from PyQt4 import QtGui app = QtGui.QApplication([]) w = QtGui.QLineEdit() w.show() 然后出现一个文本输入小部件。我可以在与翻译互动的同时与之互动。如果我附加了任何事件处理程序,它们也会被调用 如果我做导入时间;time.sleep(10),小部件将在10秒钟内无响应 如果我运行app.exec(),该调用将一直阻塞,直到我关闭应用程序 我的问题是:如果小部件已经在响应事

如果打开Python解释器并输入以下行:

from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()
然后出现一个文本输入小部件。我可以在与翻译互动的同时与之互动。如果我附加了任何事件处理程序,它们也会被调用

如果我做
导入时间;time.sleep(10)
,小部件将在10秒钟内无响应

如果我运行app.exec(),该调用将一直阻塞,直到我关闭应用程序

我的问题是:如果小部件已经在响应事件,那么运行app.exec()有什么意义?有什么不同?这是否只是一种防止应用程序关闭的方法,同时仍在为Qt的事件循环提供服务(
while True:pass
会导致事件循环阻塞,正如我们在执行
time.sleep(10)
时所理解的那样)


我还想了解Qt是如何连接到CPython的,它允许解释器和GUI处于活动状态。我知道Python2(可能还有3?)有一个所谓的
PyOS_InputHook
机制,大约每秒调用10次。IPython使用它来运行GUI(要以每秒10次以上的速度处理GUI事件,需要付出大量的努力)。当我实例化一个
QApplication
时,是否也会发生同样的事情?如果是这样,那么在交互式会话中使用PyQt/PySide时,调用
app.exec_u3;()

有什么意义呢?事件处理在后台自动设置,允许您直接与对象交互。例如,您可以创建并显示一个窗口,然后在窗口仍然可见的情况下从python shell中向其添加其他小部件。不过,这种行为是特定于交互式会话的,它只允许您轻松地进行实验,而无需自己设置事件处理

根据PyQt文档,
PyOS_InputHook
用于处理事件,而交互式解释器正在等待用户输入(请参见:)-PySide可能也使用了类似的机制

对于从脚本启动的普通PyQt/PySide应用程序,必须显式调用
app.exec()
,才能启动事件处理。否则,脚本将在所有代码执行完毕后立即退出(即,与任何其他python脚本一样)


(要更深入地了解Qt的事件处理,请参阅:)。

您使用的是什么Python解释器?IPython还是真正的纯python?如果将相同的代码放在.py文件中并运行它,可能不会得到相同的行为?Python和IPython都会出现这种情况。如果我将代码放在一个.py文件中,并将该文件导入到会话中,就会得到上面的行为。如果我
pythonscript.py
,脚本将完成,gui窗口将立即消失。