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

7 投票
5 回答
7520 浏览
提问于 2025-04-16 11:12

我正在测试一个用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()。你也可以把时间设置为零,这样函数就会立刻被加入到执行队列中。

撰写回答