在PyQt4中创建一个加载窗口

时间:2016-06-27 16:11:22

标签: python multithreading matplotlib pyqt pyqt4

我有一个使用嵌入式matplotlib绘图绘制数据的程序,并添加了有用的可视化。当这些可视化很重时,问题是matplotlib可能非常慢,直到主窗口挂起。我无法在不同的线程或进程中添加这些图形,因为PyQt禁止从主线程(除了主线程)之外的任何地方更新主窗口,所以我希望有另一个窗口,基本上是一个永久进度条,我可以在完成图表时杀死:

# Creates a new window with an endless progress bar
class LoadingWindow(QtGui.QMainWindow):
    def __init__(self):
        super(LoadingWindow, self).__init__()
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        main_widget = QtGui.QWidget(self)
        layout = QtGui.QVBoxLayout()
        layout.addWidget(QtGui.QLabel("Graphing now. Please wait...", self))
        progress = QtGui.QProgressBar(self)
        progress.setMinimum(0)
        progress.setMaximum(0)
        layout.addWidget(progress)

        main_widget.setLayout(layout)
        main_widget.setFocus()
        self.setCentralWidget(main_widget)
        self.show()

...但是当我创建此类的实例时,加载栏不会显示,并且两个窗口都挂起。有没有办法让这个窗口出现在新的线程或进程中?或者是否有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我发现了我的问题。这不是一个全面的修复,但我必须回到可视化添加的位置,并定期调用此函数:

QtGui.QApplication.processEvents()

这让我的UI每隔一段时间更新一次,这样窗口至少不会挂起。我还认为最好禁用主窗口,以便用户在生成图形时不会弄乱,我从原始帖子添加了加载窗口,以便用户知道发生了什么。