【问题标题】:Execute Python code from within PyQt event loop从 PyQt 事件循环中执行 Python 代码
【发布时间】:2011-02-04 01:42:11
【问题描述】:

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

我找到了this 在线程中运行 PyQt 循环的示例,但不想做一些非常规的事情。在调用exec_ 之后,有什么方法可以让 PyQt 消息循环继续处理消息,同时在主线程中执行 python 代码?

【问题讨论】:

  • 您能解释一下在第二个线程中运行 PyQt 循环或您自己的附加代码的问题吗?您如何没有两个线程同时执行两个代码路径?
  • 我可以在第二个线程中安排测试,但有些测试涉及逻辑并且不仅仅是单个函数或对象。有没有办法将一段 python 代码传递给 QThread 并让 QThread 作为运行的一部分执行该代码?
  • 看来我不能在 QThread 中使用 execfile。

标签: python multithreading events loops pyqt


【解决方案1】:

这里的一个选择是在调用 `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()。您可以将时间设置为零以使添加的函数立即排队等待执行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        不完全确定你想做什么。您是否正在为 PyQt 寻找类似 @​​987654321@ 的东西?

        【讨论】:

          【解决方案5】:

          最简单的方法是使用 IPython:

          ipython --gui=qt4
          

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

          【讨论】:

          • 请注意,这依赖于 Python inputhook 功能,该功能在解释器空闲时运行。例如,如果你在解释器中输入一个长时间运行的循环,Qt 事件循环将不会运行。
          猜你喜欢
          • 2014-10-10
          • 2020-12-17
          • 1970-01-01
          • 2017-06-01
          • 1970-01-01
          • 2016-07-18
          • 2015-03-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多