【问题标题】:How to run PyQt in ipython without frozen GUI when running other commands on console?在控制台上运行其他命令时,如何在 ipython 中运行 PyQt 而不会冻结 GUI?
【发布时间】:2021-08-14 02:08:52
【问题描述】:

我目前正在使用 ipython 运行 PyQt5 应用程序,但是当我在 ipython 控制台上启动一些耗时的命令后,GUI 被冻结。

我能找到的最接近的答案来自 How to have Qt run asynchroneously for interactive use like Matplotlib's ion mode? 。但是,那里提供的答案并不能解决我的问题。

我根据上一篇文章创建了一个类似的示例。

from PyQt5.QtWidgets import QApplication, QGraphicsRectItem, QGraphicsScene, QGraphicsView, QMainWindow
import time


%gui qt5

class Rect(QGraphicsRectItem):
  def mousePressEvent(self, event):
    print("foo")

window = QMainWindow()
window.setGeometry(100, 100, 400, 400)
view = QGraphicsView()
scene = QGraphicsScene()
rect = Rect(0, 0, 150, 150)
scene.addItem(rect)
view.setScene(scene)
window.setCentralWidget(view)
window.show()

time.sleep(1000) # Suppose we are running some other commands on ipython console, then the GUI freezes

【问题讨论】:

    标签: python pyqt5 ipython


    【解决方案1】:

    你好像没明白“%gui qt5”的目的是什么,那个命令表示ipython会使用Qt eventloop。所以如果你想运行一些耗时的任务,那么你应该在另一个线程中运行它。

    【讨论】:

    • 我明白了。在这种情况下,我可以把 GUI 放到一个单独的线程中,这样它就不会被冻结?
    • @DauZi 不,如果你打算使用 Qt,那么 GUI 应该在主线程上运行,而其他耗时的应该在子线程上运行,以防止 eventloop 冻结
    • 有没有办法创建一个新线程(或QThread),然后将当前的ipython控制台线程切换到那个QThread?
    • @DauZi 不先生,Qt制定的规则很严格:eventloop必须在主线程中执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多