From 42c0ea2dfe621b3b62b8cc76749ad6d5524a22fe Mon Sep 17 00:00:00 2001 From: eendebakpt Date: Mon, 9 May 2016 15:22:37 +0200 Subject: [PATCH 1/9] added logviewer --- qcodes/tools/logviewer.py | 113 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 qcodes/tools/logviewer.py diff --git a/qcodes/tools/logviewer.py b/qcodes/tools/logviewer.py new file mode 100644 index 000000000000..656717d613fb --- /dev/null +++ b/qcodes/tools/logviewer.py @@ -0,0 +1,113 @@ +import sys,os +import re +import logging + +import qcodes +import qcodes as qc +import qtpy.QtCore as QtCore +import qtpy.QtGui as QtGui +import pyqtgraph as pg +#import pmatlab + +def findfilesR(p, patt): + """ Get a list of files (recursive) + + Arguments + --------- + + p (string): directory + patt (string): pattern to match + + """ + lst = [] + rr = re.compile(patt) + for root, dirs, files in os.walk(p, topdown=False): + lst += [os.path.join(root, f) for f in files if re.match(rr, f)] + return lst + +class LogViewer(QtGui.QWidget): + + def __init__(self, window_title='Log Viewer', debugdict=dict()): + super(LogViewer, self).__init__() + + self.text= QtGui.QLabel() + self.text.setText('Log files at %s' % qcodes.DataSet.default_io.base_location) + self.logtree= QtGui.QTreeView() # QTreeWidget + self.logtree.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self._treemodel = QtGui.QStandardItemModel() + self.logtree.setModel(self._treemodel) + self.__debug = debugdict + self.qplot= qc.QtPlot(remote=False) + self.plotwindow= self.qplot.win + #self.plotwindow = pg.GraphicsWindow(title='dummy') + + vertLayout = QtGui.QVBoxLayout() + vertLayout.addWidget(self.text) + vertLayout.addWidget(self.logtree) + vertLayout.addWidget(self.plotwindow) + self.setLayout(vertLayout) + + self._treemodel.setHorizontalHeaderLabels(['Log', 'Comments']) + self.setWindowTitle(window_title) + self.logtree.header().resizeSection(0, 240) + + + # disable edit + self.logtree.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) + + self.logtree.doubleClicked.connect(self.logCallback) + + self.updateLogs() + def updateLogs(self): + pass + + model=self._treemodel + dd=findfilesR(qcodes.DataSet.default_io.base_location, '.*dat') + print(dd) + + logs=dict() + for i, d in enumerate(dd): + tag= os.path.basename(d) + datetag, logtag=d.split('/')[-2:] + if not datetag in logs: + logs[datetag]=dict() + logs[datetag][logtag]=d + + for i, datetag in enumerate(sorted(logs.keys())[::-1]): + parent1 = QtGui.QStandardItem(datetag) + for j, logtag in enumerate(logs[datetag]): + child1 = QtGui.QStandardItem(logtag) + child2 = QtGui.QStandardItem('info about plot') + child3 = QtGui.QStandardItem(os.path.join(datetag, logtag) ) + parent1.appendRow([child1, child2, child3]) + model.appendRow(parent1) + # span container columns + self.logtree.setFirstColumnSpanned(i, self.logtree.rootIndex(), True) + + def logCallback(self, index): + print('logCallback!') + logging.debug('index %s'% str(index)) + self.__debug['last']=index + pp=index.parent() + row=index.row() + + + tag=pp.child(row,2).data() + + # load data + if tag is not None: + print('logCallback! tag %s' % tag) + try: + logging.debug('load tag %s' % tag) + data=qc.load_data(tag) + + self.qplot.clear(); + self.qplot.add(data.amplitude); + + except Exception as e: + print('logCallback! error ...' ) + logging.debug(e) + pass + pass + + From c8cb80d0545f33f0352988f53692de06cc4d3b8b Mon Sep 17 00:00:00 2001 From: eendebakpt Date: Tue, 17 May 2016 10:05:17 +0200 Subject: [PATCH 2/9] rename to DataViewer; make plotting parameter flexible --- qcodes/tools/{logviewer.py => dataviewer.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename qcodes/tools/{logviewer.py => dataviewer.py} (100%) diff --git a/qcodes/tools/logviewer.py b/qcodes/tools/dataviewer.py similarity index 100% rename from qcodes/tools/logviewer.py rename to qcodes/tools/dataviewer.py From 4e98b5722477ff2ae2f119a95251629c25a347a7 Mon Sep 17 00:00:00 2001 From: eendebakpt Date: Tue, 17 May 2016 10:07:16 +0200 Subject: [PATCH 3/9] update from previous commit --- qcodes/tools/dataviewer.py | 60 ++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 656717d613fb..253dff143d8d 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -1,3 +1,5 @@ +#%% Load packages + import sys,os import re import logging @@ -7,7 +9,6 @@ import qtpy.QtCore as QtCore import qtpy.QtGui as QtGui import pyqtgraph as pg -#import pmatlab def findfilesR(p, patt): """ Get a list of files (recursive) @@ -25,11 +26,23 @@ def findfilesR(p, patt): lst += [os.path.join(root, f) for f in files if re.match(rr, f)] return lst -class LogViewer(QtGui.QWidget): - - def __init__(self, window_title='Log Viewer', debugdict=dict()): - super(LogViewer, self).__init__() +#%% Main class +class DataViewer(QtGui.QWidget): + ''' Simple viewer for Qcodes data + + Arugments + --------- + + default_parameter : string + name of default parameter to plot + ''' + def __init__(self, window_title='Log Viewer', default_parameter='amlitude', debugdict=dict()): + super(DataViewer, self).__init__() + + self.default_parameter = default_parameter + + # setup GUI self.text= QtGui.QLabel() self.text.setText('Log files at %s' % qcodes.DataSet.default_io.base_location) self.logtree= QtGui.QTreeView() # QTreeWidget @@ -54,10 +67,11 @@ def __init__(self, window_title='Log Viewer', debugdict=dict()): # disable edit self.logtree.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) - self.logtree.doubleClicked.connect(self.logCallback) - + + # get logs from disk self.updateLogs() + def updateLogs(self): pass @@ -84,6 +98,20 @@ def updateLogs(self): # span container columns self.logtree.setFirstColumnSpanned(i, self.logtree.rootIndex(), True) + ''' Return parameter to be plotted ''' + def plot_parameter(self, data): + + if self.default_parameter in data.arrays.keys(): + return self.default_parameter + if 'amplitude' in data.arrays.keys(): + return 'amplitude' + + try: + key= (iter (data.arrays.values())) + return key + except: + return None + def logCallback(self, index): print('logCallback!') logging.debug('index %s'% str(index)) @@ -102,8 +130,14 @@ def logCallback(self, index): data=qc.load_data(tag) self.qplot.clear(); - self.qplot.add(data.amplitude); - + + param_name=self.plot_parameter(data) + + if param_name is not None: + logging.info('using parameter %s for plotting' % param_name) + self.qplot.add( getattr(data, param_name) ); + else: + logging.info('could not find parameter for DataSet') except Exception as e: print('logCallback! error ...' ) logging.debug(e) @@ -111,3 +145,11 @@ def logCallback(self, index): pass +#%% Testing + +if __name__=='__main__': + logviewer = DataViewer() + logviewer.setGeometry(1920+1280,60, 700,800) + logviewer.qplot.win.setMaximumHeight(400) + logviewer.show() + self=logviewer From 5a0a23237e36ee0089fa4a56c79796f18752ad19 Mon Sep 17 00:00:00 2001 From: eendebakpt Date: Tue, 17 May 2016 10:47:36 +0200 Subject: [PATCH 4/9] use new data storage format --- qcodes/tools/dataviewer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 253dff143d8d..2e390ebb28a6 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -82,11 +82,13 @@ def updateLogs(self): logs=dict() for i, d in enumerate(dd): tag= os.path.basename(d) - datetag, logtag=d.split('/')[-2:] + datetag, logtag=d.split('/')[-3:-1] if not datetag in logs: logs[datetag]=dict() logs[datetag][logtag]=d + self.logs = logs + for i, datetag in enumerate(sorted(logs.keys())[::-1]): parent1 = QtGui.QStandardItem(datetag) for j, logtag in enumerate(logs[datetag]): @@ -107,7 +109,7 @@ def plot_parameter(self, data): return 'amplitude' try: - key= (iter (data.arrays.values())) + key= next(iter (data.arrays.keys())) return key except: return None From ca07dc5a8d7dcd71044b8386d6f1f9fd29c46fe3 Mon Sep 17 00:00:00 2001 From: Pieter Date: Wed, 3 Aug 2016 23:38:35 +0200 Subject: [PATCH 5/9] clean up code --- qcodes/tools/dataviewer.py | 180 ++++++++++++++++++++++--------------- 1 file changed, 108 insertions(+), 72 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 2e390ebb28a6..13fc4f58b827 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -1,14 +1,27 @@ #%% Load packages -import sys,os +import os import re import logging -import qcodes -import qcodes as qc -import qtpy.QtCore as QtCore import qtpy.QtGui as QtGui +import qtpy.QtWidgets as QtWidgets import pyqtgraph as pg +import argparse + +import qcodes +from qcodes.plots.pyqtgraph import QtPlot + +parser = argparse.ArgumentParser() +parser.add_argument('-v', '--verbose', default=1, help="verbosity level") +parser.add_argument( + '-d', '--datadir', type=str, default=None, help="data directory") +args = parser.parse_args() +verbose = args.verbose +datadir = args.datadir + +#%% Helper functions + def findfilesR(p, patt): """ Get a list of files (recursive) @@ -22,136 +35,159 @@ def findfilesR(p, patt): """ lst = [] rr = re.compile(patt) - for root, dirs, files in os.walk(p, topdown=False): + for root, _, files in os.walk(p, topdown=False): lst += [os.path.join(root, f) for f in files if re.match(rr, f)] return lst #%% Main class -class DataViewer(QtGui.QWidget): + + +class DataViewer(QtWidgets.QWidget): ''' Simple viewer for Qcodes data - + Arugments --------- - + default_parameter : string name of default parameter to plot ''' - def __init__(self, window_title='Log Viewer', default_parameter='amlitude', debugdict=dict()): + + def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='amlitude'): super(DataViewer, self).__init__() self.default_parameter = default_parameter - + + self.datadir = datadir + if self.datadir is None: + self.datadir = qcodes.DataSet.default_io.base_location + + qcodes.DataSet.default_io = qcodes.DiskIO(datadir) + # setup GUI - self.text= QtGui.QLabel() - self.text.setText('Log files at %s' % qcodes.DataSet.default_io.base_location) - self.logtree= QtGui.QTreeView() # QTreeWidget - self.logtree.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.text = QtWidgets.QLabel() + self.text.setText('Log files at %s' % + self.datadir) + self.logtree = QtWidgets.QTreeView() # QTreeWidget + self.logtree.setSelectionBehavior( + QtWidgets.QAbstractItemView.SelectRows) self._treemodel = QtGui.QStandardItemModel() self.logtree.setModel(self._treemodel) - self.__debug = debugdict - self.qplot= qc.QtPlot(remote=False) - self.plotwindow= self.qplot.win - #self.plotwindow = pg.GraphicsWindow(title='dummy') + self.__debug = dict() + self.qplot = QtPlot(remote=False) + self.plotwindow = self.qplot.win - vertLayout = QtGui.QVBoxLayout() + vertLayout = QtWidgets.QVBoxLayout() vertLayout.addWidget(self.text) vertLayout.addWidget(self.logtree) vertLayout.addWidget(self.plotwindow) self.setLayout(vertLayout) self._treemodel.setHorizontalHeaderLabels(['Log', 'Comments']) - self.setWindowTitle(window_title) + self.setWindowTitle(window_title) self.logtree.header().resizeSection(0, 240) - # disable edit - self.logtree.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) + self.logtree.setEditTriggers( + QtWidgets.QAbstractItemView.NoEditTriggers) self.logtree.doubleClicked.connect(self.logCallback) - # get logs from disk + # get logs from disk self.updateLogs() - - def updateLogs(self): - pass - model=self._treemodel - dd=findfilesR(qcodes.DataSet.default_io.base_location, '.*dat') + def updateLogs(self): + model = self._treemodel + dd = findfilesR(self.datadir, '.*dat') print(dd) - - logs=dict() + + logs = dict() for i, d in enumerate(dd): - tag= os.path.basename(d) - datetag, logtag=d.split('/')[-3:-1] + datetag, logtag = d.split('/')[-3:-1] if not datetag in logs: - logs[datetag]=dict() - logs[datetag][logtag]=d + logs[datetag] = dict() + logs[datetag][logtag] = d self.logs = logs - - for i, datetag in enumerate(sorted(logs.keys())[::-1]): + + for i, datetag in enumerate(sorted(logs.keys())[::-1]): parent1 = QtGui.QStandardItem(datetag) - for j, logtag in enumerate(logs[datetag]): + for j, logtag in enumerate(sorted(logs[datetag])): child1 = QtGui.QStandardItem(logtag) child2 = QtGui.QStandardItem('info about plot') - child3 = QtGui.QStandardItem(os.path.join(datetag, logtag) ) + child3 = QtGui.QStandardItem(os.path.join(datetag, logtag)) parent1.appendRow([child1, child2, child3]) model.appendRow(parent1) # span container columns - self.logtree.setFirstColumnSpanned(i, self.logtree.rootIndex(), True) + self.logtree.setFirstColumnSpanned( + i, self.logtree.rootIndex(), True) - ''' Return parameter to be plotted ''' def plot_parameter(self, data): - - if self.default_parameter in data.arrays.keys(): + ''' Return parameter to be plotted ''' + arraynames = data.arrays.keys() + if self.default_parameter in arraynames: return self.default_parameter + vv = [v for v in arraynames if v.endswith('default_parameter')] + if (len(vv) > 0): + return vv[0] + vv = [v for v in arraynames if v.endswith('amplitude')] + if (len(vv) > 0): + return vv[0] + if 'amplitude' in data.arrays.keys(): return 'amplitude' try: - key= next(iter (data.arrays.keys())) + key = next(iter(data.arrays.keys())) return key - except: + except Exception: return None - + def logCallback(self, index): - print('logCallback!') - logging.debug('index %s'% str(index)) - self.__debug['last']=index - pp=index.parent() - row=index.row() - - - tag=pp.child(row,2).data() - + ''' Function called when a log entry is selected ''' + logging.info('logCallback!') + logging.debug('logCallback: index %s' % str(index)) + self.__debug['last'] = index + pp = index.parent() + row = index.row() + + tag = pp.child(row, 2).data() + # load data if tag is not None: print('logCallback! tag %s' % tag) try: - logging.debug('load tag %s' % tag) - data=qc.load_data(tag) - - self.qplot.clear(); - - param_name=self.plot_parameter(data) - - if param_name is not None: - logging.info('using parameter %s for plotting' % param_name) - self.qplot.add( getattr(data, param_name) ); + logging.debug('load tag %s' % tag) + data = qcodes.load_data(tag) + + self.qplot.clear() + + infotxt = 'arrays: ' + ', '.join(list(data.arrays.keys())) + q = pp.child(row, 1).model() + q.setData(pp.child(row, 1), infotxt) + + param_name = self.plot_parameter(data) + + if param_name is not None: + logging.info( + 'using parameter %s for plotting' % param_name) + self.qplot.add(getattr(data, param_name)) else: logging.info('could not find parameter for DataSet') except Exception as e: - print('logCallback! error ...' ) - logging.debug(e) + print('logCallback! error ...') + print(e) + logging.warning(e) pass pass #%% Testing -if __name__=='__main__': - logviewer = DataViewer() - logviewer.setGeometry(1920+1280,60, 700,800) - logviewer.qplot.win.setMaximumHeight(400) - logviewer.show() - self=logviewer +if __name__ == '__main__': + app = pg.mkQApp() + + dataviewer = DataViewer(datadir=datadir) + dataviewer.setGeometry(1920 + 1280, 60, 700, 800) + dataviewer.qplot.win.setMaximumHeight(400) + dataviewer.show() + self = dataviewer From c20b8486c0b04e390547065e7088a04fece20310 Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 4 Aug 2016 11:04:25 +0200 Subject: [PATCH 6/9] add logging info --- qcodes/tools/dataviewer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 13fc4f58b827..0cd4c86aed3e 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -58,12 +58,13 @@ def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='a self.default_parameter = default_parameter + if datadir is None: + datadir = qcodes.DataSet.default_io.base_location self.datadir = datadir - if self.datadir is None: - self.datadir = qcodes.DataSet.default_io.base_location qcodes.DataSet.default_io = qcodes.DiskIO(datadir) - + logging.info('DataViewer: data directory %s' % datadir) + # setup GUI self.text = QtWidgets.QLabel() self.text.setText('Log files at %s' % From b70e0904101e6ff2d03260a3a8f9deaf0a878cbe Mon Sep 17 00:00:00 2001 From: Pieter Date: Thu, 4 Aug 2016 16:56:49 +0200 Subject: [PATCH 7/9] fix for windows --- qcodes/tools/dataviewer.py | 40 ++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 0cd4c86aed3e..0df1df34a499 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -12,14 +12,6 @@ import qcodes from qcodes.plots.pyqtgraph import QtPlot -parser = argparse.ArgumentParser() -parser.add_argument('-v', '--verbose', default=1, help="verbosity level") -parser.add_argument( - '-d', '--datadir', type=str, default=None, help="data directory") -args = parser.parse_args() -verbose = args.verbose -datadir = args.datadir - #%% Helper functions @@ -75,7 +67,7 @@ def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='a self._treemodel = QtGui.QStandardItemModel() self.logtree.setModel(self._treemodel) self.__debug = dict() - self.qplot = QtPlot(remote=False) + self.qplot = QtPlot(remote=False, interval=0) self.plotwindow = self.qplot.win vertLayout = QtWidgets.QVBoxLayout() @@ -99,15 +91,18 @@ def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='a def updateLogs(self): model = self._treemodel dd = findfilesR(self.datadir, '.*dat') - print(dd) + print('found %d files' % (len(dd))) + #print(dd) logs = dict() for i, d in enumerate(dd): - datetag, logtag = d.split('/')[-3:-1] - if not datetag in logs: - logs[datetag] = dict() - logs[datetag][logtag] = d - + try: + datetag, logtag = d.split(os.sep)[-3:-1] + if not datetag in logs: + logs[datetag] = dict() + logs[datetag][logtag] = d + except: + pass self.logs = logs for i, datetag in enumerate(sorted(logs.keys())[::-1]): @@ -184,11 +179,22 @@ def logCallback(self, index): #%% Testing -if __name__ == '__main__': + +if __name__=='__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-v', '--verbose', default=1, help="verbosity level") + parser.add_argument( + '-d', '--datadir', type=str, default=None, help="data directory") + args = parser.parse_args() + verbose = args.verbose + datadir = args.datadir + app = pg.mkQApp() dataviewer = DataViewer(datadir=datadir) - dataviewer.setGeometry(1920 + 1280, 60, 700, 800) + dataviewer.setGeometry(1280, 60, 700, 800) dataviewer.qplot.win.setMaximumHeight(400) dataviewer.show() self = dataviewer + + app.exec() \ No newline at end of file From 49a385f7e1cbbd6717d1eaed185059d4cd5ffa40 Mon Sep 17 00:00:00 2001 From: Pieter Date: Mon, 8 Aug 2016 17:22:07 +0200 Subject: [PATCH 8/9] remove bot warnings --- qcodes/tools/dataviewer.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 0df1df34a499..8e25b1c68e7b 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -41,11 +41,11 @@ class DataViewer(QtWidgets.QWidget): Arugments --------- - default_parameter : string - name of default parameter to plot + datadir (string or None): directory to scan for experiments + default_parameter (string): name of default parameter to plot ''' - def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='amlitude'): + def __init__(self, datadir=None, window_title='Data browser', default_parameter='amlitude'): super(DataViewer, self).__init__() self.default_parameter = default_parameter @@ -56,7 +56,7 @@ def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='a qcodes.DataSet.default_io = qcodes.DiskIO(datadir) logging.info('DataViewer: data directory %s' % datadir) - + # setup GUI self.text = QtWidgets.QLabel() self.text.setText('Log files at %s' % @@ -89,10 +89,11 @@ def __init__(self, datadir=None, window_title='Log Viewer', default_parameter='a self.updateLogs() def updateLogs(self): + ''' Update the list of measurements ''' model = self._treemodel dd = findfilesR(self.datadir, '.*dat') - print('found %d files' % (len(dd))) - #print(dd) + print('found %d files' % (len(dd))) + # print(dd) logs = dict() for i, d in enumerate(dd): @@ -101,7 +102,7 @@ def updateLogs(self): if not datetag in logs: logs[datetag] = dict() logs[datetag][logtag] = d - except: + except Exception: pass self.logs = logs @@ -173,14 +174,13 @@ def logCallback(self, index): print('logCallback! error ...') print(e) logging.warning(e) - pass pass -#%% Testing +#%% Run the GUI as a standalone program -if __name__=='__main__': +if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', default=1, help="verbosity level") parser.add_argument( @@ -197,4 +197,4 @@ def logCallback(self, index): dataviewer.show() self = dataviewer - app.exec() \ No newline at end of file + app.exec() From 6f734625cfdd414bf79d336c78e10e283eec0ce5 Mon Sep 17 00:00:00 2001 From: Pieter Date: Mon, 8 Aug 2016 23:26:36 +0200 Subject: [PATCH 9/9] update dataviewer for feeature/QtPlot branch --- qcodes/tools/dataviewer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qcodes/tools/dataviewer.py b/qcodes/tools/dataviewer.py index 8e25b1c68e7b..39bc711ee0fb 100644 --- a/qcodes/tools/dataviewer.py +++ b/qcodes/tools/dataviewer.py @@ -67,8 +67,8 @@ def __init__(self, datadir=None, window_title='Data browser', default_parameter= self._treemodel = QtGui.QStandardItemModel() self.logtree.setModel(self._treemodel) self.__debug = dict() - self.qplot = QtPlot(remote=False, interval=0) - self.plotwindow = self.qplot.win + self.qplot = QtPlot() # remote=False, interval=0) + self.plotwindow = self.qplot vertLayout = QtWidgets.QVBoxLayout() vertLayout.addWidget(self.text)