在PyQt事件循环中执行Python代码
我正在测试一个用PyQt构建的图形用户界面(GUI),我希望能够在PyQt事件循环开始后,用执行的Python代码与这个界面进行互动,也就是说,我希望调用app.exec_()
后能立即返回,就像这个界面是无模式的一样,然后再执行其他的Python代码来与这个界面进行交互。
我找到了一些关于在一个线程中运行PyQt循环的例子,但我不想做这么不寻常的事情。有没有办法让PyQt的消息循环在调用exec_
后继续处理消息,同时在主线程中执行Python代码呢?
5 个回答
0
我明白了。我可以通过主线程一行一行地执行测试脚本,使用exec命令,然后再从一个工作线程中运行图形界面。
1
作为一个简单的解决办法,试着不要在你的脚本里调用 app.exec_()
,而是用 python -i My_PyQt_app.py
来运行你的 PyQt 程序。
比如:
## My_PyQt_app.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.show()
# Don't start the event loop as you would do normally!
# app.exec_()
这样做应该可以让你通过终端运行图形界面,并在命令行中与它进行互动。
2
这里有一个选择,就是使用 QtCore.QTimer.singleShot()
这个方法,在调用 `exec_()` 之后启动你的 Python 代码。
举个例子:
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
# Setup the GUI.
gui = MyGui()
gui.showMainWindow()
# Post a call to your python code.
QtCore.QTimer.singleShot(1000, somePythonFunction)
sys.exit(app.exec_())
这样做会在1秒后执行函数 somePythonFunction()
。你也可以把时间设置为零,这样函数就会立刻被加入到执行队列中。