我正在尝试构建一个桌面应用程序,可以在流数据到达时绘制一些图表。我希望能够打开多个窗口来监视不同的流。
它工作得很好,直到我开始关闭图表窗口。
我的问题是关闭其中一个图表窗口经常会导致所有窗口关闭并退出应用程序。终端中没有出现错误消息,所有窗口都简单地关闭并终止程序。关闭图表窗口应该只关闭图表窗口。
我在Windows 10上使用PyQt5、PyQtGraph 0.10.0和Python 3.6.1。
下面的代码显示了我的应用程序结构。
1. https://github.com/pyqtgraph/pyqtgraph/issues/55 2. 小部件的父级 - 必要吗? 问题明显与PlotWidget有关。如果将绘图小部件替换为按钮,则不会观察到任何崩溃。
我从1中得到了添加“cls.chart.close()”行来覆盖closeEvent的想法。这有所帮助。崩溃变得不那么频繁,但在关闭约20个图表窗口后,仍然会发生崩溃。
我还尝试使所有小部件成为它们所驻留的窗口的子级,但这没有效果。
有什么想法吗?我无法相信打开和关闭包含绘图的窗口就足以使PyQt崩溃,因此我认为我在结构上做了一些愚蠢的事情。
它工作得很好,直到我开始关闭图表窗口。
我的问题是关闭其中一个图表窗口经常会导致所有窗口关闭并退出应用程序。终端中没有出现错误消息,所有窗口都简单地关闭并终止程序。关闭图表窗口应该只关闭图表窗口。
我在Windows 10上使用PyQt5、PyQtGraph 0.10.0和Python 3.6.1。
下面的代码显示了我的应用程序结构。
- The App class keeps track of the open windows and stores chart data. (In reality this class collects the streaming data and calls an update routine for the relevant open windows.)
- The ButtonWindow class can be used to make new chart windows. (In reality, there are many buttons depending on what the user wishes to chart.)
The ChartWindow class displays the data.
import PyQt5.QtWidgets as qt import pyqtgraph as pg class App(qt.QApplication): def __init__(self,args): qt.QApplication.__init__(self,args) #window tracking self.last_idx = 0 self.windows = {} #chart data self.x = [1,2,3,4,5] self.y = [1,2,3,4,5] #create button window self.button_window = ButtonWindow(self) #enter event loop self.exec_() def new_window(cls): cls.windows[cls.last_idx] = ChartWindow(cls, cls.last_idx) cls.last_idx += 1 def close_window(cls, window_id): cls.windows[window_id].destroy() del cls.windows[window_id] class ButtonWindow(qt.QWidget): def __init__(self, app): qt.QWidget.__init__(self) self.grid = qt.QGridLayout() self.app = app #add a button self.btn = qt.QPushButton('+1 Chart Window') self.btn.clicked.connect(self.app.new_window) self.grid.addWidget(self.btn,0,0) self.setLayout(self.grid) #show window self.show() class ChartWindow(qt.QWidget): def __init__(self, app, window_id): qt.QWidget.__init__(self) self.grid = qt.QGridLayout() self.app = app self.window_id = window_id self.setWindowTitle('Chart Window '+str(self.window_id)) #add a chart self.chart = pg.PlotWidget() self.chart.plot(app.x,app.y) self.grid.addWidget(self.chart,0,0) self.setLayout(self.grid) #show window self.show() def closeEvent(cls,event): #cls.chart.close() cls.app.close_window(cls.window_id) def main(): app = App([]) if __name__ == '__main__': main()
1. https://github.com/pyqtgraph/pyqtgraph/issues/55 2. 小部件的父级 - 必要吗? 问题明显与PlotWidget有关。如果将绘图小部件替换为按钮,则不会观察到任何崩溃。
我从1中得到了添加“cls.chart.close()”行来覆盖closeEvent的想法。这有所帮助。崩溃变得不那么频繁,但在关闭约20个图表窗口后,仍然会发生崩溃。
我还尝试使所有小部件成为它们所驻留的窗口的子级,但这没有效果。
有什么想法吗?我无法相信打开和关闭包含绘图的窗口就足以使PyQt崩溃,因此我认为我在结构上做了一些愚蠢的事情。
def closeEvent(cls,event): #cls.chart.close() cls.app.close_window(cls.window_id)
- eyllanesc