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

时间:2011-02-04 01:42:12

标签: python multithreading events loops pyqt

我正在测试使用PyQt构建的gui,我希望能够使用在PyQt事件循环开始后执行的python代码与gui进行交互(app.exec_())。另一种说法是我想要的对app.exec_的调用立即返回,好像gui是无模式的,然后是与gui交互的更多python代码。

我发现this在一个线程中运行PyQt循环的例子,但不想做一些非常规的事情。有没有办法让PyQt消息循环继续处理消息,同时在调用exec_后在主线程中执行python代码?

5 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

不完全确定你想做什么。你在为PyQt寻找像Py(known as PyCrust)这样的东西吗?

答案 2 :(得分:0)

这里的一个选项是在调用`exec _()'之后使用QtCore.QTimer.singleShot()调用来启动你的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()。您可以将时间设置为零,以便立即将添加的功能排队等待执行。

答案 3 :(得分:0)

最简单的方法是使用IPython:

ipython --gui=qt4

有关更多选项(例如gtk,tk等),请参阅ipython --helponline documentation

答案 4 :(得分:0)

作为一个可能的简单答案,请尝试不要在脚本中调用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并在命令行中与之交互。