从PyQt事件循环中执行Python代码

7
我正在测试使用PyQt构建的GUI,并希望能够在PyQt事件循环启动后(app.exec_()),使用Python代码与GUI进行交互。换句话说,我希望调用app.exec_后立即返回,就像GUI是无模态一样,然后再执行进一步与GUI交互的Python代码。
我发现了一个在线程中运行PyQt循环的示例,但不想做这么不寻常的事情。有没有办法让PyQt消息循环在调用exec_后继续处理消息,同时在主线程中执行Python代码与GUI交互?

2
你能解释一下在第二个线程中运行PyQt循环或自己的额外代码存在什么问题吗?如果没有两个线程,你将如何能够同时执行两个代码路径? - Mike Daniels
我可以在第二个线程中安排测试,但其中一些测试涉及逻辑并且不止一个函数或对象。是否有一种方法将Python代码块传递给QThread,并使QThread作为run的一部分执行该代码? - Cerberellum
似乎我无法在QThread内使用execfile。 - Cerberellum
5个回答

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()。 您可以将时间设置为零,以便立即将函数添加到队列中等待执行。


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

这样做应该可以让你通过终端运行GUI并在命令行中与其交互。


0

最简单的方法是使用IPython:

ipython --gui=qt4

查看 ipython --help在线文档 以获取更多选项(例如 gtk、tk 等)。


请注意,这依赖于Python的inputhook功能,该功能在解释器空闲时运行。例如,如果您在解释器中输入一个长时间运行的循环,则Qt事件循环将不会运行。 - Gus

0

我明白了。我可以使用exec逐行执行测试脚本,然后从工作线程运行GUI。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接