Hi,

A while back I noticed random crashes on a Windows 7 machine after 
upgrading PyQt5 to 5.11, which from memory was similar. The same code and 
Python/PyQt versions on the Linux machines was fine. Didn't spend much time 
troubleshooting, just did a pip install PyQt5==5.10.1 to downgrade PyQt 
version and problem went away...

Maybe that will help?

Patrick

On Tuesday, 28 January 2020 11:02:48 UTC+10:30, Dustin Hibberd wrote:
>
> Hello,
>
> I have been using pyqtgraph with pyqt5 on a number of GUI's at my office.  
> I used to run them all using python 2.7 and didn't have any problems with 
> random crashes.  However, now that I've started using python 3.7, 
> everything seem so much less stable. My GUI's will randomly crash with no 
> traceback / error message. The window simply closes, despite wrapping 
> general try/excepts over most functions that should print out the 
> exception.  I'm using the anaconda package and IPython console built into 
> Spyder. 
>
> The crashing persists
>  - on multiple different installs on different computers. 
>  - running scripts locally and network based
>  - All on python 3.7 and Windows 10
>  - sometimes happens when I click buttons
>  - sometimes seems to happen due to mouse / hover events
>
> I'm not entirely convinced it's due to the pyqtgraph import but I figured 
> this is a good place to start since my one application that does not use 
> pyqtgraph doesn't seem to have this problem.
>
>
> I recently got it to be more stable by only running the GUI script once 
> from a specific console instance.   My only lead is that it might has 
> something to do with running the GUI from the console multiple times in a 
> row ( I often do this when I'm adjusting pen colors / layouts etc)
>
> My biggest problem is that I get no traceback or clue as to what's going 
> on. It just closes without any message at all.
>
> Here's a few relevant code snippets: 
>
>
>
> import sys
> import time
> import traceback
> import numpy as np
> from functools import partial
>
> from PyQt5 import QtWidgets, QtCore, QtGui
> from PyQt5.QtCore import pyqtSignal
> import pyqtgraph.exporters
> import pyqtgraph as pg
>
>
> import DB_Control_v002 as DB
> import pyqtGraphPresets_v001 as pgPre
>
> class MainWindow(QtWidgets.QMainWindow):
>     
>     sigCount = pyqtSignal()
>     
>     def __init__(self, parent=None):
>         super(self.__class__, self).__init__(parent)
>                 
>         # Allows for statistical anylisis from the SPC table
>         # if an SPC table is not chosen it is changed to false and no 
> analysis is done
>         # if the openened database is closed, it is then turned back to 
> True
>         self.statsEnabled = True
>         self.statsGraphs = {}
>         self.check_list  = []
>         
>         
>         """Create Status Bar"""        
>         
>         self.MainStatus = self.statusBar()
>         
>         """ Create MainWindow """
>         self.setObjectName("Data Viewer")
>         self.resize(1500, 800)
>         self.setWindowTitle("Data Viewer")
>         
>         self.setWindowIcon(QtGui.QIcon('line-chart.png'))
>         
>         graph_color = pg.mkColor(float(.9))
>         pg.setConfigOption('background', graph_color)
>         pg.setConfigOption('foreground', 'k')
>         
>         
>         self.layout = QtWidgets.QGridLayout()                #establishes 
> Grid layout style
>         self.layout.setContentsMargins(20,20,20,20)
>         self.layout.setHorizontalSpacing(9)
>         self.layout.setVerticalSpacing(1)
>         
>         """ Font Creation """
>         
>         self.font1 = QtGui.QFont("Times New Roman", pointSize=15)
>         self.font2 = QtGui.QFont("Helvetica",pointSize=12)
>         
>         """ Graph Pen Creation """
>         self.magenta_line = pg.mkPen(width=1, color='m')
>         self.red_line = pg.mkPen(width=1, color='r')
>         self.green_line = pg.mkPen(width=1, color=(52, 127, 6), 
> style=QtCore.Qt.DashLine)
>         self.yellow_dash = pg.mkPen(width=2, color=(249, 157, 19), 
> style=QtCore.Qt.DashLine)
>         self.purp_dash = pg.mkPen(width=1,color=(182, 59, 191), 
> style=QtCore.Qt.DashLine)
>         self.blank = QtGui.QColor(0,0,0,0)
>         
>         """ ToolBar Creation """
>         
>         toolbar_main = QtWidgets.QToolBar(self)
>         toolbar_main.setWindowTitle("Filter")
>         toolbar_main.setMovable(False)
>         toolbar_main.setIconSize(QtCore.QSize(50,50))
>         self.addToolBar(toolbar_main)
>         
>         self.but_open = 
> QtWidgets.QAction(QtGui.QIcon("download.png"),"Open new SQL Database",self)
>         self.but_close = 
> QtWidgets.QAction(QtGui.QIcon("cancel.png"),"Close Database",self)
>
>         self.but_spc = QtWidgets.QAction(QtGui.QIcon("fence.png"),"SPC 
> ",self)
>         self.but_spc.setCheckable(True)
>         self.but_avg = 
> QtWidgets.QAction(QtGui.QIcon("avg.png"),"Average",self)
>         self.but_avg.setCheckable(True)
>         self.but_sigma = 
> QtWidgets.QAction(QtGui.QIcon("sigma.png"),"Control Limits",self)
>         self.but_sigma.setCheckable(True)
>         self.but_minmax = 
> QtWidgets.QAction(QtGui.QIcon("min-max.png"),"Min - Max",self)
>         self.but_minmax.setCheckable(True)
>         
>         self.but_feed = 
> QtWidgets.QAction(QtGui.QIcon("play_grad.png"),"Start live feed.",self)
>         self.but_feed.setCheckable(True)
>         
>         self.stats_but_list = [self.but_spc, self.but_avg, self.but_sigma, 
> self.but_minmax]
>         
>         spacer_list = [QtGui.QWidget(self) for i in range(3)]
>         for spacer in spacer_list:
>             
> spacer.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
>             spacer.setMinimumWidth(40)
>         
>         toolbar_main.addAction(self.but_open)
>         toolbar_main.addAction(self.but_close)
>         toolbar_main.addWidget(spacer_list[0])
>
>         toolbar_main.addWidget(spacer_list[1])
>         
>         toolbar_main.addAction(self.but_spc)
>         toolbar_main.addAction(self.but_avg)
>         toolbar_main.addAction(self.but_sigma)
>         toolbar_main.addAction(self.but_minmax)
>         toolbar_main.insertSeparator(self.but_spc)
>         
>         toolbar_main.addWidget(spacer_list[2])
>         
>         toolbar_main.addAction(self.but_feed)
>         toolbar_main.insertSeparator(self.but_feed)
>
>         """ Create Tab Zone """
>        
>         self.Tab_zone = QtWidgets.QTabWidget()
>         self.Tab_zone.tabCloseRequested.connect(self.closeTab)
>
>         self.layout.addWidget(self.Tab_zone)
>         self.setCentralWidget(self.Tab_zone)
>         self.setLayout(self.layout)
>         
>    
>
>         """ Button Connections """
>                
>         self.but_open.triggered.connect(self.openFile)
>         self.but_close.triggered.connect(self.closeFile)
>         
>         self.but_spc.triggered.connect(self.toggleStatLines)
>         self.but_avg.triggered.connect(self.toggleStatLines)
>         self.but_sigma.triggered.connect(self.toggleStatLines)
>         self.but_minmax.triggered.connect(self.toggleStatLines)
>         
>         self.but_feed.triggered.connect(self.handleFeed)
>         
>         
>         
>         self.updateStatus(0)
>         
>         
>     
>     def updateStatus(self, status):
>         # 0 = no database opened, or database closed
>         # 1 = database opened
>         
>         if status == 0:
>             self.but_open.setEnabled(True)
>             self.but_close.setEnabled(False)
>             self.but_feed.setEnabled(False)
>             
>             for but in self.stats_but_list:
>                 but.setEnabled(False)
>
>         if status == 1:
>             self.but_open.setEnabled(False)
>             self.but_close.setEnabled(True)
>             self.but_feed.setEnabled(True)
>             
>             for but in self.stats_but_list:
>                 but.setEnabled(True)
>
>
> def openSummaryTab(self):
>         
>         try:
>             tab = QtWidgets.QWidget()
>             layout = QtWidgets.QGridLayout()
>             
>             param_list = [col for col in self.dataFrame.columns]
>
>             row_limit = 25
>             start_row = 4
>             for i, param in enumerate(param_list):
>                 col = (i)//row_limit
>                 row = i+start_row - row_limit*col
>                 button = QtWidgets.QCheckBox(param)
>                 
> button.setSizePolicy(QtWidgets.QSizePolicy.Minimum,QtWidgets.QSizePolicy.Expanding)
>                 button.stateChanged.connect(self.updateSummaryGraph)
>                 button.stateChanged.connect(partial(self.openStatsTab, 
> button))
>                 
>                 self.check_list.append(button)
>                 layout.addWidget(button,row,col,1,1)
>             
>             label_Xaxis = QtWidgets.QLabel('Select X-Axis')
>             label_Xaxis.setAlignment(QtCore.Qt.AlignCenter)
>             
> label_Xaxis.setSizePolicy(QtWidgets.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
>             label_Xaxis.setFont(self.font1)
>             
>             self.combo_Xaxis = QtWidgets.QComboBox()
>             for param in param_list:
>                 self.combo_Xaxis.addItem(param)
>             
> self.combo_Xaxis.currentIndexChanged.connect(self.sortTableView)
>             layout.addWidget(self.combo_Xaxis, 1, 0, 1, 
> layout.columnCount()-1)   
>              
>             self.text_mode = QtWidgets.QCheckBox('Text Mode')
>             layout.addWidget(self.text_mode, 2, 0, 1, 
> layout.columnCount()-1)
>             self.text_mode.stateChanged.connect(self.setTextMode)
>             
>             
>             label_Yaxis = QtWidgets.QLabel('Select Y-Axis')
>             label_Yaxis.setAlignment(QtCore.Qt.AlignCenter)
>             
> label_Yaxis.setSizePolicy(QtWidgets.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
>             label_Yaxis.setFont(self.font1)
>             
>             layout.addWidget(label_Xaxis,0,0,1,layout.columnCount())
>             layout.addWidget(label_Yaxis,3,0,1,layout.columnCount())
>    
>             self.Xaxis = pgPre.CustomAxis(orientation='bottom')
>             if self.text_mode.isChecked():
>                 self.Xaxis.setTextMode(True)
>             
>             self.sumGraph = pg.PlotWidget(axisItems={'bottom': self.Xaxis})
>             self.sumGraph.showGrid(x=True,y=True)
>             
> self.combo_Xaxis.currentIndexChanged.connect(self.updateSummaryGraph)
>             
> self.combo_Xaxis.currentIndexChanged.connect(self.updateAllStatsGraph)
>             self.header.sigUpdate.connect(self.updateSummaryGraph)
>             
>             self.updateSummaryGraph()
>                        
>             
> layout.addWidget(self.sumGraph,0,layout.columnCount(),layout.rowCount(),1)
>             
>     
>     
>             tab.setLayout(layout)
>             self.Tab_zone.addTab(tab, "Summary")
>             
>             self.updateStatus(1)
>
>             
>
>         except Exception as ex:
>             tb = sys.exc_info()[-1]
>             self.MainStatus.showMessage("openSummaryTab Error : {} | Line 
> : {} | Details : {}".format(type(ex).__name__,tb.tb_lineno,ex.args))
>
>
>     def updateSummaryGraph(self):
>             try:
>                 y_axis_title_list = []
>                 color_list = ['#0080FF', '#FF0000', '#00FF00','#FF007F',
>                               '#00FFFF', '#FF8000',
>                               '#7F00FF', '#FF00FF', '#FFFF00',
>                               '#E0E0E0', '#606060']             
>
>                 self.sumGraph.plot([],[], clear=True)
>                 
>                 x_param = self.combo_Xaxis.currentText()
>                 
>                 if self.text_mode.isChecked():
>                     self.Xaxis.x_list = self.getStrings(x_param)
>                     x = list(range(len(self.Xaxis.x_list)))
>                 
>                 else:
>                     x = self.getGraphData(x_param)
>                 
>                 
>                     
>                 color=0
>                 for item in self.check_list:
>                     item.setStyleSheet('')
>                     
>                     if item.isChecked():
>                        
>                         y_param = item.text()
>                         y = self.getGraphData(y_param)
>                         y_axis_title_list.append(y_param)
>
>                         brush = pg.mkBrush(color=color_list[color], 
> symbol='o')
>                         self.sumGraph.plot(x, y, pen=color_list[color], 
> symbolBrush=brush, symbolPen='k')
>                         
>                         
>                         item.setStyleSheet("background-color: 
> {}".format(color_list[color]))
>                         color += 1
>                         if color > (len(color_list)-1):
>                             color = 0
>             
>                 self.sumGraph.setLabels(title = 'Summary Graph', left = 
> str(y_axis_title_list), bottom = x_param)
>
>
>
> def main():
>     try:
>         sys.excepthook = traceback.print_exception
>         
>         app = 0
>         app = QtWidgets.QApplication(sys.argv)
>         app.setQuitOnLastWindowClosed(True)
>         
>         
>         dlg = MainWindow() 
>         dlg.show()
>         dlg.raise_()
>         
>         sys.exit(app.exec_())
>         
>     except SystemExit as sysEx:
>         if sysEx.args[0] == 0:
>             pass
>         else:
>             print(sysEx.args)
>         
>     except Exception as ex:
>        print(ex)
>         
> if __name__ == "__main__":
>     main()
>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/4b692437-2f11-41c9-9fd8-7fd56893f599%40googlegroups.com.

Reply via email to