def populate(self): self.items_by_pair_id = {} self.session = db.Session() db_expts = db.list_experiments(session=self.session) db_expts.sort(key=lambda e: e.acq_timestamp) for expt in db_expts: date = expt.acq_timestamp date_str = datetime.fromtimestamp(date).strftime('%Y-%m-%d') slice = expt.slice expt_item = pg.TreeWidgetItem(map(str, [date_str, expt.rig_name, slice.species, expt.target_region, slice.genotype, expt.acsf])) expt_item.expt = expt self.addTopLevelItem(expt_item) for pair in expt.pairs: if pair.n_ex_test_spikes == 0 and pair.n_in_test_spikes == 0: continue cells = '%d => %d' % (pair.pre_cell.ext_id, pair.post_cell.ext_id) conn = {True:"syn", False:"-", None:"?"}[pair.synapse] types = 'L%s %s => L%s %s' % (pair.pre_cell.target_layer or "?", pair.pre_cell.cre_type, pair.post_cell.target_layer or "?", pair.post_cell.cre_type) pair_item = pg.TreeWidgetItem([cells, conn, types]) expt_item.addChild(pair_item) pair_item.pair = pair pair_item.expt = expt self.items_by_pair_id[pair.id] = pair_item
def addVisItem(self, name, visitem): print "[detector display] received visitem=", name self.user_items[name] = visitem self.user_item_checkboxes[name] = QtGui.QCheckBox('') self.map_user_checkboxes2name[self.user_item_checkboxes[name]] = name self.user_item_checkboxes[name].setChecked(True) # connect to signal # multiple sub-objects! if type(visitem) is list: self.user_subitem_cbxs[name] = [] for ix, subitem in enumerate(visitem): self.user_subitem_cbxs[name].append(QtGui.QCheckBox('')) self.user_subitem_cbxs[name][ix].setChecked(True) # make tree widget item item = pg.TreeWidgetItem(['', name]) item.setWidget(0, self.user_item_checkboxes[name]) self.user_item_tree.addTopLevelItem(item) if type(visitem) is list: for ix in range(0, len(visitem)): subitem = visitem[ix] if hasattr(subitem, "uservisname"): subname = subitem.uservisname + "_%d" % (ix) else: subname = name + "_%d" % (ix) subitem = pg.TreeWidgetItem([subname]) item.addChild(subitem) self.user_item_tree.setItemWidget( subitem, 1, self.user_subitem_cbxs[name][ix])
def populate(self, experiments=None): self.items_by_pair_id = {} self.session = db.session() if experiments is None: experiments = db.list_experiments(session=self.session) # preload all cells,pairs so they are not queried individually later on pairs = self.session.query(db.Pair, db.Experiment, db.Cell, db.Slice).join(db.Experiment, db.Pair.experiment_id==db.Experiment.id).join(db.Cell, db.Cell.id==db.Pair.pre_cell_id).join(db.Slice).all() experiments.sort(key=lambda e: e.acq_timestamp) for expt in experiments: date = expt.acq_timestamp date_str = datetime.fromtimestamp(date).strftime('%Y-%m-%d') slice = expt.slice expt_item = pg.TreeWidgetItem(map(str, [date_str, '%0.3f'%expt.acq_timestamp, expt.rig_name, slice.species, expt.project_name, expt.target_region, slice.genotype, expt.acsf])) expt_item.expt = expt self.addTopLevelItem(expt_item) for pair in expt.pair_list: # if pair.n_ex_test_spikes == 0 and pair.n_in_test_spikes == 0: # continue cells = '%s => %s' % (pair.pre_cell.ext_id, pair.post_cell.ext_id) conn = {True:"syn", False:"-", None:"?"}[pair.has_synapse] types = 'L%s %s => L%s %s' % (pair.pre_cell.target_layer or "?", pair.pre_cell.cre_type, pair.post_cell.target_layer or "?", pair.post_cell.cre_type) pair_item = pg.TreeWidgetItem([cells, conn, types]) expt_item.addChild(pair_item) pair_item.pair = pair pair_item.expt = expt self.items_by_pair_id[pair.id] = pair_item # also allow select by ext id self.items_by_pair_id[(expt.acq_timestamp, pair.pre_cell.ext_id, pair.post_cell.ext_id)] = pair_item self.verticalScrollBar().setValue(self.verticalScrollBar().maximum())
def setupGUI(self): self.setWindowTitle("Edit Gradients") self.setGeometry(500, 300, 400, 200) self.layout = QtGui.QVBoxLayout() self.setLayout(self.layout) self.layout.setContentsMargins(0, 0, 0, 0) self.tree = pg.TreeWidget() self.layout.addWidget(self.tree) self.tree.setHeaderHidden(True) self.tree.setDragEnabled(False) self.tree.setIndentation(10) self.tree.setColumnCount(3) self.sItem = pg.TreeWidgetItem(['Original Sonic Data']) self.fItem = pg.TreeWidgetItem(['Fourrier Transform']) self.pItem = pg.TreeWidgetItem(['Fourrier Phases']) self.tree.addTopLevelItem(self.sItem) self.tree.addTopLevelItem(self.fItem) self.tree.addTopLevelItem(self.pItem) self.sgw = pg.GradientWidget(orientation='top') self.fgw = pg.GradientWidget(orientation='top') self.pgw = pg.GradientWidget(orientation='top') self.sItem.setWidget(2, self.sgw) self.fItem.setWidget(2, self.fgw) self.pItem.setWidget(2, self.pgw) self.tree.setColumnWidth(0, 150) #### widget of ok and Cancel buttons self.buttonsWidget = QtGui.QWidget() self.buttonLayout = QtGui.QHBoxLayout() self.buttonsWidget.setLayout(self.buttonLayout) self.okButton = QtGui.QPushButton("OK") self.cancelButton = QtGui.QPushButton("Cancel") self.buttonLayout.addWidget(self.okButton) self.buttonLayout.addWidget(self.cancelButton) self.buttonLayout.setContentsMargins(0, 0, 0, 5) self.layout.addWidget(self.buttonsWidget)
def setupGUI(self): self.setWindowTitle("Edit effectibve stress formula") self.setGeometry(500, 300, 350, 200) # self.centralWidget = QtGui.QWidget() # self.setCentralWidget(self.centralWidget) self.centralLayout = QtGui.QVBoxLayout() # self.centralWidget.setLayout(self.centralLayout) self.setLayout(self.centralLayout) self.variablesText = QtGui.QLabel('') tree = pg.TreeWidget() tree.setHeaderHidden(True) tree.setIndentation(0) tree.setColumnCount(3) # stuff to make gray background for tree widget g = pg.mkBrush(240, 240, 240) b = pg.mkBrush(0, 0, 0) w = pg.mkBrush(255, 255, 255) bgBrush = pg.mkBrush(255, 0, 0) tree.setFrameShape(QtGui.QFrame.NoFrame) palette = QtGui.QPalette(g, g, g, g, g, b, b, g, g) # tree.setPalette(palette) axStressItem = pg.TreeWidgetItem(['Axial stress']) # axStressItem.setTextAlignment(0,0) # axStressItem.setBackground(1,w) confStressItem = pg.TreeWidgetItem(['Confining pressure']) # confStressItem.setTextAlignment(0,0) porePressItem = pg.TreeWidgetItem(['Pore pressure']) biotItem = pg.TreeWidgetItem(['Biot coefficient']) porePressItem.setTextAlignment(0, 0) self.axStressBox = QtGui.QLineEdit() self.confStressBox = QtGui.QLineEdit() self.porePressBox = QtGui.QLineEdit() self.biotBox = pg.SpinBox(value=1, bounds=[0.5, 1], step=0.1) axStressItem.setWidget(1, self.axStressBox) confStressItem.setWidget(1, self.confStressBox) biotItem.setWidget(1, self.biotBox) porePressItem.setWidget(1, self.porePressBox) tree.addTopLevelItem(axStressItem) tree.addTopLevelItem(confStressItem) tree.addTopLevelItem(porePressItem) tree.addTopLevelItem(biotItem) self.centralLayout.addWidget(self.variablesText) self.centralLayout.addWidget(tree) # self.centralLayout.addWidget(self.buttonsWidget) tree.setColumnWidth(0, 120) tree.setColumnWidth(1, 170) tree.setColumnWidth(2, 10)
def setupGUI(self): self.setWindowTitle("Customize Combo plot") self.setGeometry(500, 300, 400, 300) # add central widget to window # set layout to central widget # add treewidget and another widget to # place button layout self.centralWidget = QtGui.QWidget() self.setCentralWidget(self.centralWidget) self.centralLayout = QtGui.QVBoxLayout() self.centralWidget.setLayout(self.centralLayout) self.tree = pg.TreeWidget() self.centralLayout.addWidget(self.tree) self.buttonsWidget = QtGui.QWidget() self.centralLayout.addWidget(self.buttonsWidget) self.centralLayout.setContentsMargins(0, 0, 0, 0) # set up button layout self.buttonLayout = QtGui.QHBoxLayout() self.buttonsWidget.setLayout(self.buttonLayout) self.OkButton = QtGui.QPushButton() self.CancelButton = QtGui.QPushButton() self.OkButton.setText("OK") self.CancelButton.setText("Cancel") self.buttonLayout.addWidget(self.OkButton) self.buttonLayout.addWidget(self.CancelButton) self.buttonLayout.setContentsMargins(0, 0, 0, 0) ## set up tree widget self.tree.setHeaderHidden(True) self.tree.setDragEnabled(False) self.tree.setColumnCount(3) self.tree.setColumnWidth(0, 100) self.tree.setColumnWidth(1, 270) self.tree.setColumnWidth(2, 10) self.xNameParameter = pg.TreeWidgetItem(['X axis']) self.yNameParameter = pg.TreeWidgetItem(['Y axis']) self.fontSizeParameter = pg.TreeWidgetItem(['Font size']) self.tree.addTopLevelItem(self.xNameParameter) self.tree.addTopLevelItem(self.yNameParameter) self.tree.addTopLevelItem(self.fontSizeParameter) self.xNameBox = QtGui.QLineEdit() self.yNameBox = QtGui.QLineEdit() self.xNameBox.setText(self.xname) self.yNameBox.setText(self.yname) self.fontSizeBox = pg.SpinBox(value=self.fsize, bounds=[10, 20], step=1) self.xNameParameter.setWidget(1, self.xNameBox) self.yNameParameter.setWidget(1, self.yNameBox) self.fontSizeParameter.setWidget(1, self.fontSizeBox) self.CancelButton.clicked.connect(self.cancel)
def addChild(self, parent, column, title, data): #item = QtGui.QTreeWidgetItem(parent, [title]) item = pg.TreeWidgetItem(parent, [title]) self.solid_checkboxes[title] = item item.setData(column, QtCore.Qt.UserRole, data) item.setCheckState(column, QtCore.Qt.Checked) return item
def __init__(self, name=None, items=None, colors=None): super(CParameterTree, self).__init__() self.name = name self.setColumnCount(4) self.setHeaderHidden(True) self.setDragEnabled(False) self.header = pg.TreeWidgetItem([name]) self.setIndentation(0) headerBackgroundColor = pg.mkBrush(color=(100, 100, 100)) fontcolor = pg.mkBrush(color=(255, 255, 255)) self.setupHeader() # self.header.setBackground(0,headerBackgroundColor) # self.header.setBackground(1,headerBackgroundColor) # self.header.setBackground(2,headerBackgroundColor) # self.header.setBackground(3,headerBackgroundColor) # self.header.setForeground(0,fontcolor) # self.addTopLevelItem(self.header) # self.header.setSizeHint(0,QtCore.QSize(-1, 25)) # self.setColumnWidth (0, 100) # self.setColumnWidth (1, 50) # self.setColumnWidth (2, 70) self.setColumnWidth(3, 5) if items is not None: self.names = items else: self.names = [] self.items = {} # main widgets self.colors = {} # color widgets self.boxes = {} # checkbox widgets self.groups = {} # just empty items if items: self.addItems(items, colors)
def poller_update(self, rec): ts = rec['timestamp'] if ts in self.records: item = self.records[ts]['item'] self.records[ts].update(rec) else: item = pg.TreeWidgetItem() self.expt_tree.addTopLevelItem(item) rec['item'] = item self.records[ts] = rec item.expt = rec['expt'] for field, val in rec.items(): try: i = self.fields.index(field) except ValueError: continue if isinstance(val, tuple): val, color = val else: color = None if val is True: color = pass_color elif val in (False, 'ERROR'): color = fail_color item.setText(i, str(val)) if color is not None: item.setBackgroundColor(i, pg.mkColor(color))
def addEnvelope(self,etype='Coulomb',name='Env'): item = pg.TreeWidgetItem([name]) self.envelopes.addChild(item) self.eNames.append(name) self.eTypes[name] = etype typeLabel = QtGui.QLabel(etype) item.setWidget(2,typeLabel) colorButton = ColorButton() self.eCButtons[name] = colorButton color = get_color() colorButton.setColor(color) item.setExpanded(True) self.eBoxes[name] = {} colorItem = pg.TreeWidgetItem(['Color']) if etype == 'Coulomb': item1 = pg.TreeWidgetItem(['Friction Angle']) item2 = pg.TreeWidgetItem(['Cohesion']) step1 = 1 step2 = 50 elif etype == 'Brown': item1 = pg.TreeWidgetItem(['m']) item2 = pg.TreeWidgetItem(['UCS']) step1 = 1 step2 = 1 else: print etype return 0 item.addChild(colorItem) item.addChild(item1) item.addChild(item2) frictionBox = pg.SpinBox(value=50, step=step1) cohesionBox = pg.SpinBox(value=1e3, step=step2) frictionBox.sigValueChanged.connect(self.plot) cohesionBox.sigValueChanged.connect(self.plot) colorItem.setWidget(2,colorButton) item1.setWidget(2,frictionBox) item2.setWidget(2,cohesionBox) self.fBoxes[name] = frictionBox self.cBoxes[name] = cohesionBox for dname in self.dNames: child = pg.TreeWidgetItem([dname]) item.addChild(child) box = CheckBox() child.setWidget(2,box) self.eBoxes[name][dname] = box box.click() box.clicked.connect(lambda:self.getEnvelope(name)) removeEnvelopeItem = pg.TreeWidgetItem(['']) item.addChild(removeEnvelopeItem) removeButton = QtGui.QPushButton('Remove') removeEnvelopeItem.setWidget(2,removeButton) removeButton.clicked.connect(lambda:self.removeEnvelope(item)) colorButton.sigColorChanged.connect(self.plot) self.nEnvelopes += 1 self.getEnvelope(eName=name)
def setupGUI(self): pg.setConfigOption('background', (255,255,255)) pg.setConfigOption('foreground',(0,0,0)) self.setWindowIcon(QtGui.QIcon('../images/Logo.png')) self.setGeometry(80, 30, 1000, 700) # layout is the main layout widget self.layout = QtGui.QVBoxLayout() # sublayout is a widget we add plot window to self.sublayout = pg.GraphicsLayoutWidget() self.layout.setContentsMargins(0,0,0,0) self.layout.setSpacing(0) self.setLayout(self.layout) # split window into two halfs self.splitter = QtGui.QSplitter() self.splitter.setOrientation(QtCore.Qt.Horizontal) self.layout.addWidget(self.splitter) self.tree = pg.TreeWidget() self.splitter.addWidget(self.tree) self.splitter.addWidget(self.sublayout) self.plt = self.sublayout.addPlot() setup_plot(self.plt) pg.setConfigOptions(antialias=True) self.tree.setHeaderHidden(True) self.tree.setDragEnabled(False) self.tree.setIndentation(10) self.tree.setColumnCount(4) self.tree.setColumnWidth(0, 150) self.tree.setColumnWidth(1, 20) self.tree.setColumnWidth(2, 90) self.tree.setColumnWidth(3, 50) # self.tree.setColumnWidth(3, 50) self.fpoints = pg.TreeWidgetItem(['Failure Points']) self.envelopes = pg.TreeWidgetItem(['Failure Envelopes']) self.tree.addTopLevelItem(self.fpoints) self.tree.addTopLevelItem(self.envelopes) self.tree.setDragEnabled(False) self.fpoints.setExpanded(True) self.envelopes.setExpanded(True) addEnvelopeItem = pg.TreeWidgetItem(['']) self.tree.addTopLevelItem(addEnvelopeItem) self.addEnvelopeButton = QtGui.QPushButton('Add Envelope') addEnvelopeItem.setWidget(0,self.addEnvelopeButton)
def __init__(self, recipe): self.recipe = recipe pg.TreeWidgetItem.__init__(self, [recipe.solution.name]) self.textItem = pg.TreeWidgetItem() self.addChild(self.textItem) self.editor = RichTextEdit() self.textItem.setWidget(0, self.editor) if recipe.notes is not None: self.editor.setHtml(recipe.notes) self.editor.textChanged.connect(self.textChanged)
def addItem(self): name = 'Item_%d' % (self.nmax) self.names.append(name) item = pg.TreeWidgetItem([name]) # self.tree.addTopLevelItem(item) # self.tree.insertTopLevelItem(2+self.nItems,item) self.items.addChild(item) self.items.setExpanded(True) self.nItems += 1 self.nmax += 1 colorButton = ColorButton() self.colorButtons[name] = colorButton item.setWidget(1, colorButton) color = get_color() colorButton.setColor(color) xitem = pg.TreeWidgetItem(['x']) yitem = pg.TreeWidgetItem(['y']) xline = QtGui.QLineEdit() yline = QtGui.QLineEdit() xline.setPlaceholderText('Enter expression') yline.setPlaceholderText('Enter expression') self.xTextBoxes[name] = xline self.yTextBoxes[name] = yline self.xTexts[name] = '' self.yTexts[name] = '' self.plotItems[name] = {} xitem.setWidget(1, xline) yitem.setWidget(1, yline) item.addChild(xitem) item.addChild(yitem) item.setExpanded(True) buttonItem = pg.TreeWidgetItem() removeButton = QtGui.QPushButton('Remove') self.removeButtons[name] = removeButton buttonItem.setWidget(1, removeButton) item.addChild(buttonItem) removeButton.pressed.connect(self.removeItem) colorButton.sigColorChanged.connect(self.plot)
def setupGUI(self): self.setWindowTitle("Calculator plot") self.setGeometry(80, 50, 800, 600) self.setWindowIcon(QtGui.QIcon('../images/Logo.png')) pg.setConfigOption('background', (255, 255, 255)) pg.setConfigOption('foreground', (0, 0, 0)) self.layout = QtGui.QVBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.layout.setSpacing(0) self.setLayout(self.layout) # split window into two halfs self.splitter = QtGui.QSplitter() self.splitter.setOrientation(QtCore.Qt.Horizontal) self.layout.addWidget(self.splitter) self.tree = pg.TreeWidget() self.sublayout = pg.GraphicsLayoutWidget() self.splitter.addWidget(self.tree) self.splitter.addWidget(self.sublayout) self.plt = self.sublayout.addPlot() setup_plot(self.plt) pg.setConfigOptions(antialias=True) self.tree.setHeaderHidden(True) self.tree.setDragEnabled(False) self.tree.setIndentation(10) self.tree.setColumnCount(3) self.tree.setColumnWidth(0, 110) self.tree.setColumnWidth(1, 90) self.tree.setColumnWidth(2, 5) optItem = pg.TreeWidgetItem(['Options']) xNameItem = pg.TreeWidgetItem(['x title']) yNameItem = pg.TreeWidgetItem(['y title']) optItem.addChild(xNameItem) optItem.addChild(yNameItem) addPlotItem = pg.TreeWidgetItem() self.addPlotButton = QtGui.QPushButton('Add') self.enterAction = QtGui.QAction('', self, shortcut='Return') self.addAction(self.enterAction) self.applyButton = QtGui.QPushButton('Apply') self.applyButton.setDisabled(True) addPlotItem.setWidget(0, self.applyButton) addPlotItem.setWidget(1, self.addPlotButton) self.items = pg.TreeWidgetItem(['Items']) self.tree.addTopLevelItem(optItem) self.tree.addTopLevelItem(self.items) self.tree.addTopLevelItem(pg.TreeWidgetItem()) self.tree.addTopLevelItem(addPlotItem) optItem.setExpanded(True) self.xNameEdit = QtGui.QLineEdit('X') self.yNameEdit = QtGui.QLineEdit('Y') xNameItem.setWidget(1, self.xNameEdit) yNameItem.setWidget(1, self.yNameEdit) self.plt.setLabel('bottom', 'X', **LabelStyle) self.plt.setLabel('left', 'Y', **LabelStyle)
def poller_update(self, rec): ts = rec['timestamp'] if ts in self.records: item = self.records[ts]['item'] self.records[ts].update(rec) else: item = pg.TreeWidgetItem() self.expt_tree.addTopLevelItem(item) rec['item'] = item self.records[ts] = rec for i, field in enumerate( ['timestamp', 'rig', 'has_metadata_qc', 'has_site_mosaic']): item.setText(i, str(rec[field]))
def addLayer(self, layer): if isinstance(layer, PixelLayerBase): nPixelLayersPost = self.nPixelLayers() self.pixelLayers[layer.name()] = layer if (nPixelLayersPost == 0): self.treeWidget.addTopLevelItem(self.pixelLayersItem) layerItem = pg.TreeWidgetItem(['']) self.pixelLayersItem.addChild(layerItem) ctrlWidget = layer.makeCtrlWidget() layerItem.setWidget(0, ctrlWidget) else: raise RuntimeError("Not yet implemented")
def setupHeader(self): self.header = pg.TreeWidgetItem([self.name]) self.setIndentation(0) headerBackgroundColor = pg.mkBrush(color=(100, 100, 100)) fontcolor = pg.mkBrush(color=(255, 255, 255)) self.header.setBackground(0, headerBackgroundColor) self.header.setBackground(1, headerBackgroundColor) self.header.setBackground(2, headerBackgroundColor) self.header.setBackground(3, headerBackgroundColor) self.header.setForeground(0, fontcolor) self.addTopLevelItem(self.header) self.header.setSizeHint(0, QtCore.QSize(-1, 25)) self.setColumnWidth(0, 100) self.setColumnWidth(1, 50) self.setColumnWidth(2, 70)
def __init__(self, hdf): self.hdf = hdf name = hdf.name parent = hdf.parent if parent is not hdf: name = name[len(parent.name.rstrip('/')) + 1:] pg.TreeWidgetItem.__init__(self, [name]) if isinstance(hdf, h5py.Group) and len(self.hdf.keys()) > 0: self._loading_item = pg.TreeWidgetItem(["loading.."]) self.addChild(self._loading_item) self._children_loaded = False else: self._loading_item = None self._children_loaded = True
def addData(self, s1, s3, name=None): if name is None: name = 'Untitled_%d' % (self.nData) self.s1 = np.append(self.s1, s1) self.s3 = np.append(self.s3, s3) item = pg.TreeWidgetItem([name]) self.datasets.append(name) self.fpoints.addChild(item) # self.tree.addTopLevelItem(item) color = (0, 0, 0) colorButton = ColorButton.ColorButton() item.setWidget(2, colorButton) self.dCButtons[name] = colorButton colorButton.setColor(color) colorButton.sigColorChanged.connect(self.plot) self.nData += 1
def addItems(self, items, colors=None, group=None, indent=5): ''' items - list of names colors - list of colors (can be None) group - name of the group. if None, items ain't grouped ''' print('Setting up tree') if group: subheader = pg.TreeWidgetItem([' ' + group]) self.header.addChild(subheader) self.groups[group] = { 'items': {}, 'boxes': {}, 'colors': {}, } k = 0 for item in sorted(items): child = GroupedTreeItem([item]) # print(item) child.setGroup(group) self.items[item] = child if group: self.groups[group]['items'][item] = child self.header.addChild(child) # box = QtGui.QCheckBox() box = CheckBox() box.setName(item) # colorButton = pg.ColorButton() colorButton = ColorButton() self.colors[item] = colorButton self.boxes[item] = box if group: self.groups[group]['boxes'][item] = box self.groups[group]['colors'][item] = colorButton self.names.append(item) child.setWidget(1, box) child.setWidget(2, colorButton) child.setText(0, ' ' * indent + item) # print colorButton.color() if colors: if k < len(colors): colorButton.setColor(colors[k]) k += 1 colorButton.sigColorChanged.connect(self.emitStateChangedSignal) box.stateChanged.connect(self.emitStateChangedSignal) self.header.setExpanded(True)
def addItem(self, name, xdata, ydata): item = pg.TreeWidgetItem([name]) self.names.append(name) self.items[name] = item self.tree.addTopLevelItem(item) # self.insertTopLevelItem(self.nitems,item) color = (rand() * 230, rand() * 230, rand() * 230) colorButton = ColorButton() self.colorButtons[name] = colorButton colorButton.setColor(color) removeButton = QtGui.QPushButton("Remove", self) self.removeButtons[name] = removeButton item.setWidget(1, colorButton) item.setWidget(2, removeButton) removeButton.clicked.connect(self.removeItem) self.xData[name] = xdata self.yData[name] = ydata
def loadhistory(self, file_name): ''' 载入历史记录 :param file_name: 指定导入的文件名称 ''' # 清除现有操作记录 self.clear() # 读取指定名称的操作记录文件至【操作记录】的UI界面 self.record_name = file_name with open(file_name, 'r') as f: for cmd_line in f.readlines(): cmd_line = cmd_line.strip('\n') cmd = cmd_line.split(' ') cmd_name = cmd[0] commanditem = pg.TreeWidgetItem([cmd[1], cmd[2]]) self.cmdlist.addTopLevelItem(commanditem) # 更新界面 self.update()
def execute(self, cmd_name, foot_v, last_v, param=None): ''' 执行操作: 1.判断redo栈是否存在操作记录,若有则删除 2.拷贝被执行对象(不可直接用=赋值,这样执行前后的对象会指向同一地址) 3.undo栈push:[执行操作名,操作记录,被执行对象] 4.【操作记录】管理器UI添加操作记录 :param cmd_name: 执行的操作记录名称 :param obj: 被执行操作的对象(被执行对象) ''' if self.redostack: self.redostack.clear() if cmd_name == 'trim_foot': self.opts[cmd_name][1] = '向{}平移{:.2f}mm'.format( self.trim_foot_param[param[0]], param[1]) f = copy.copy(foot_v) l = copy.copy(last_v) last_obj = [f, l] # 可改进 commanditem = pg.TreeWidgetItem( [self.opts[cmd_name][0], self.opts[cmd_name][1]]) self.undostack.append((cmd_name, commanditem, last_obj)) self.cmdlist.addTopLevelItem(commanditem)
def __init__(self, etype='Coulomb', name='Env', parent=None): self.parent = parent self.typeLabel = QtGui.QLabel(etype) self.treeItem = pg.TreeWidgetItem([name]) self.treeItem.setWidget(2, self.typeLabel) self.colorButton = ColorButton.ColorButton() color = get_color() self.colorButton.setColor(color) self.treeItem.setExpanded(True) self.colorItem = pg.TreeWidgetItem(['Color']) if etype == 'Coulomb': item1 = pg.TreeWidgetItem(['Friction Angle']) item2 = pg.TreeWidgetItem(['Cohesion']) step1 = 1 step2 = 50 elif etype == 'Brown': item1 = pg.TreeWidgetItem(['m']) item2 = pg.TreeWidgetItem(['UCS']) step1 = 1 step2 = 1 else: logger.error("Envelope type unknows: %s" % (etype)) # raise NotImplementedError("Envelope type unknows: %s"%(etype)) return 0 self.treeItem.addChild(self.colorItem) self.treeItem.addChild(item1) self.treeItem.addChild(item2) self.frictionBox = pg.SpinBox(value=50, step=step1) self.cohesionBox = pg.SpinBox(value=1e3, step=step2) self.colorItem.setWidget(2, self.colorButton) item1.setWidget(2, self.frictionBox) item2.setWidget(2, self.cohesionBox) self.removeItem = pg.TreeWidgetItem(['']) self.treeItem.addChild(self.removeItem) self.removeButton = QtGui.QPushButton('Remove') self.removeItem.setWidget(2, self.removeButton)
from pyqtgraph.Qt import QtCore, QtGui, QtWidgets import numpy as np app = QtWidgets.QApplication([]) w = pg.TreeWidget() w.setColumnCount(2) w.show() w.setWindowTitle('pyqtgraph example: TreeWidget') i1 = QtWidgets.QTreeWidgetItem(["Item 1"]) i11 = QtWidgets.QTreeWidgetItem(["Item 1.1"]) i12 = QtWidgets.QTreeWidgetItem(["Item 1.2"]) i2 = QtWidgets.QTreeWidgetItem(["Item 2"]) i21 = QtWidgets.QTreeWidgetItem(["Item 2.1"]) i211 = pg.TreeWidgetItem(["Item 2.1.1"]) i212 = pg.TreeWidgetItem(["Item 2.1.2"]) i22 = pg.TreeWidgetItem(["Item 2.2"]) i3 = pg.TreeWidgetItem(["Item 3"]) i4 = pg.TreeWidgetItem(["Item 4"]) i5 = pg.TreeWidgetItem(["Item 5"]) b5 = QtWidgets.QPushButton('Button') i5.setWidget(1, b5) w.addTopLevelItem(i1) w.addTopLevelItem(i2) w.addTopLevelItem(i3) w.addTopLevelItem(i4) w.addTopLevelItem(i5) i1.addChild(i11) i1.addChild(i12)
def populate(self, experiments=None, all_pairs=False, synapses=False): """Populate the browser with a list of experiments. Parameters ---------- experiments : list | None A list of Experiment instances. If None, then automatically query experiments from the default database. all_pairs : bool If False, then pairs with no qc-passed pulse responses are excluded synapses : bool If True, then only synaptically connected pairs are shown """ with pg.BusyCursor(): # if all_pairs is set to True, all pairs from an experiment will be included regardless of whether they have data self.items_by_pair_id = {} self.session = db.session() if experiments is None: # preload all cells,pairs so they are not queried individually later on q = self.session.query(db.Pair, db.Experiment, db.Cell, db.Slice) q = q.join(db.Experiment, db.Pair.experiment_id==db.Experiment.id) q = q.join(db.Cell, db.Cell.id==db.Pair.pre_cell_id) q = q.join(db.Slice) if synapses: q = q.filter(db.Pair.has_synapse==True) recs = q.all() experiments = list(set([rec.Experiment for rec in recs])) experiments.sort(key=lambda e: e.acq_timestamp) for expt in experiments: date = expt.acq_timestamp date_str = datetime.fromtimestamp(date).strftime('%Y-%m-%d') slice = expt.slice expt_item = pg.TreeWidgetItem(map(str, [date_str, '%0.3f'%expt.acq_timestamp, expt.rig_name, slice.species, expt.project_name, expt.target_region, slice.genotype, expt.acsf])) expt_item.expt = expt self.addTopLevelItem(expt_item) for pair in expt.pair_list: if all_pairs is False and pair.n_ex_test_spikes == 0 and pair.n_in_test_spikes == 0: continue if synapses and not pair.has_synapse: continue cells = '%s => %s' % (pair.pre_cell.ext_id, pair.post_cell.ext_id) conn = {True:"syn", False:"-", None:"?"}[pair.has_synapse] gap = {True:"gap", False:"-", None:"?"}[pair.has_electrical] pre_type = pair.pre_cell.cre_type if pre_type == 'unknown': dendrite_type = pair.pre_cell.morphology.dendrite_type if pair.pre_cell.morphology is not None else None pre_type = dendrite_type if dendrite_type in ['spiny', 'aspiny', 'sparsely spiny'] else pre_type post_type = pair.post_cell.cre_type if post_type == 'unknown': dendrite_type = pair.post_cell.morphology.dendrite_type if pair.pre_cell.morphology is not None else None post_type = dendrite_type if dendrite_type in ['spiny', 'aspiny', 'sparsely spiny'] else post_type types = 'L%s %s => L%s %s' % (pair.pre_cell.target_layer or "?", pre_type, pair.post_cell.target_layer or "?", post_type) pair_item = pg.TreeWidgetItem([cells, conn+' ; '+gap, types]) expt_item.addChild(pair_item) pair_item.pair = pair pair_item.expt = expt self.items_by_pair_id[pair.id] = pair_item # also allow select by ext id self.items_by_pair_id[(expt.acq_timestamp, pair.pre_cell.ext_id, pair.post_cell.ext_id)] = pair_item self.verticalScrollBar().setValue(self.verticalScrollBar().maximum())
def handle_checker_record(self, rec): expt = rec['experiment'] if expt in self.records_by_expt: # use old record / item index = self.records_by_expt[expt] item = self.records[index]['item'] else: # add new record / item item = pg.TreeWidgetItem() self.expt_tree.addTopLevelItem(item) rec['item'] = item index = self.records.add_record({}) item.index = index record = self.records[index] record['item'] = item self.records_by_expt[expt] = index # update item/record fields update_filter = False for field, val in rec.items(): if field in self.field_indices and isinstance(val, tuple): # if a tuple was given, interpret it as (text, color) val, color = val else: # otherwise make a guess on a good color color = 'w' if val is True: color = pass_color elif val is False: color = fail_color elif val in ('ERROR', 'MISSING', 'FAILED'): color = fail_color elif val == '-': # dash means item is incomplete but still acceptable color = [c * 0.5 + 128 for c in pass_color] display_val = str(val) if field == 'timestamp' and rec.get('error') is not None: color = fail_color # update this field in the record record[field] = val # update this field in the tree item try: i = self.field_indices[field] except KeyError: continue item.setText(i, display_val) if color is not None: item.setBackgroundColor(i, pg.mkColor(color)) # update filter fields filter_field = self.filter_fields.get(field) if filter_field is not None and filter_field['mode'] == 'enum' and display_val not in filter_field['values']: filter_field['values'][display_val] = True update_filter = True if update_filter: self.filter.setFields(self.filter_fields) self.filter_items(self.records[index:index+1])
def addEnvelope(self, etype='Coulomb', name='Env'): logger.info("Adding %s failure envelope: name %s" % (etype, name)) # envelope_item = EnvelopeEntry(etype, name, parent=self) # self.tree.addTopLevelItem(envelope_item.treeItem) # envelope_item.colorButton.sigColorChanged.connect(self.plot) # envelope_item.frictionBox.sigValueChanged.connect(self.plot) # envelope_item.cohesionBox.sigValueChanged.connect(self.plot) item = pg.TreeWidgetItem([name]) self.envelopes.addChild(item) self.eNames.append(name) self.eTypes[name] = etype typeLabel = QtGui.QLabel(etype) item.setWidget(2, typeLabel) colorButton = ColorButton.ColorButton() self.eCButtons[name] = colorButton color = get_color() colorButton.setColor(color) item.setExpanded(True) self.eBoxes[name] = {} colorItem = pg.TreeWidgetItem(['Color']) if etype == 'Coulomb': item1 = pg.TreeWidgetItem(['Friction Angle']) item2 = pg.TreeWidgetItem(['Cohesion']) step1 = 1 step2 = 50 elif etype == 'Brown': item1 = pg.TreeWidgetItem(['m']) item2 = pg.TreeWidgetItem(['UCS']) step1 = 1 step2 = 1 else: logger.error("Envelope type unknows: %s" % (etype)) # raise NotImplementedError("Envelope type unknows: %s"%(etype)) return 0 item.addChild(colorItem) item.addChild(item1) item.addChild(item2) frictionBox = pg.SpinBox(value=50, step=step1) cohesionBox = pg.SpinBox(value=1e3, step=step2) frictionBox.sigValueChanged.connect(self.plot) cohesionBox.sigValueChanged.connect(self.plot) colorItem.setWidget(2, colorButton) item1.setWidget(2, frictionBox) item2.setWidget(2, cohesionBox) self.fBoxes[name] = frictionBox self.cBoxes[name] = cohesionBox for dname in self.datasets: child = pg.TreeWidgetItem([dname]) item.addChild(child) box = CheckBox.CheckBox() child.setWidget(2, box) self.eBoxes[name][dname] = box box.click() box.clicked.connect(lambda: self.getEnvelope(name)) removeEnvelopeItem = pg.TreeWidgetItem(['']) item.addChild(removeEnvelopeItem) removeButton = QtGui.QPushButton('Remove') removeEnvelopeItem.setWidget(2, removeButton) removeButton.clicked.connect(lambda: self.removeEnvelope(item)) colorButton.sigColorChanged.connect(self.plot) self.nEnvelopes += 1 self.getEnvelope(eName=name)