From 5644a1704591f7c74de98b90c13c15c1744efb4c Mon Sep 17 00:00:00 2001
From: Luke Campagnola <>
Date: Thu, 31 May 2012 16:05:19 -0400
Subject: [PATCH] Added new examples
---
examples/ColorButton.py | 30 +++++++
examples/DataTreeWidget.py | 35 ++++++++
examples/ROIExamples.py | 11 ++-
examples/ScatterPlotSpeedTestTemplate.py | 42 +++++++++
examples/SpinBox.py | 105 +++++++++++++++++++++++
examples/TreeWidget.py | 45 ++++++++++
examples/__main__.py | 10 +--
7 files changed, 270 insertions(+), 8 deletions(-)
create mode 100644 examples/ColorButton.py
create mode 100644 examples/DataTreeWidget.py
create mode 100644 examples/ScatterPlotSpeedTestTemplate.py
create mode 100644 examples/SpinBox.py
create mode 100644 examples/TreeWidget.py
diff --git a/examples/ColorButton.py b/examples/ColorButton.py
new file mode 100644
index 00000000..dcac8b14
--- /dev/null
+++ b/examples/ColorButton.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+import initExample ## Add path to library (just for examples; you do not need this)
+
+"""
+Simple example demonstrating a button which displays a colored rectangle
+and allows the user to select a new color by clicking on the button.
+"""
+
+import pyqtgraph as pg
+from pyqtgraph.Qt import QtCore, QtGui
+import numpy as np
+
+app = QtGui.QApplication([])
+win = QtGui.QMainWindow()
+btn = pg.ColorButton()
+win.setCentralWidget(btn)
+win.show()
+
+def change(btn):
+ print("change", btn.color())
+def done(btn):
+ print("done", btn.color())
+
+btn.sigColorChanging.connect(change)
+btn.sigColorChanged.connect(done)
+
+## Start Qt event loop unless running in interactive mode or using pyside.
+import sys
+if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+ QtGui.QApplication.instance().exec_()
diff --git a/examples/DataTreeWidget.py b/examples/DataTreeWidget.py
new file mode 100644
index 00000000..be306ad9
--- /dev/null
+++ b/examples/DataTreeWidget.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+"""
+Simple use of DataTreeWidget to display a structure of nested dicts, lists, and arrays
+"""
+
+
+
+import initExample ## Add path to library (just for examples; you do not need this)
+
+import pyqtgraph as pg
+from pyqtgraph.Qt import QtCore, QtGui
+import numpy as np
+
+
+app = QtGui.QApplication([])
+d = {
+ 'list1': [1,2,3,4,5,6, {'nested1': 'aaaaa', 'nested2': 'bbbbb'}, "seven"],
+ 'dict1': {
+ 'x': 1,
+ 'y': 2,
+ 'z': 'three'
+ },
+ 'array1 (20x20)': np.ones((10,10))
+}
+
+tree = pg.DataTreeWidget(data=d)
+tree.show()
+tree.resize(600,600)
+
+
+## Start Qt event loop unless running in interactive mode or using pyside.
+import sys
+if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+ QtGui.QApplication.instance().exec_()
\ No newline at end of file
diff --git a/examples/ROIExamples.py b/examples/ROIExamples.py
index fbf5a255..97e137d9 100644
--- a/examples/ROIExamples.py
+++ b/examples/ROIExamples.py
@@ -62,12 +62,17 @@ update(rois[-1])
-text = """Extraction of traces from image data"""
+text = """User-Modifiable ROIs
+Click on a line segment to add a new handle.
+Right click on a handle to remove.
+"""
w2 = w.addLayout(row=0, col=1)
label2 = w2.addLabel(text, row=0, col=0)
v2a = w2.addViewBox(row=1, col=0, lockAspect=True)
-v2b = w2.addPlot(row=2, col=0)
-
+r2a = pg.PolyLineROI([[0,0], [10,10], [10,30], [30,10]], closed=True)
+v2a.addItem(r2a)
+r2b = pg.PolyLineROI([[0,-20], [10,-10], [10,-30]], closed=False)
+v2a.addItem(r2b)
text = """Building custom ROI types
ROIs can be built with a variety of different handle types
diff --git a/examples/ScatterPlotSpeedTestTemplate.py b/examples/ScatterPlotSpeedTestTemplate.py
new file mode 100644
index 00000000..8a9be334
--- /dev/null
+++ b/examples/ScatterPlotSpeedTestTemplate.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'ScatterPlotSpeedTestTemplate.ui'
+#
+# Created: Tue May 8 23:09:16 2012
+# by: PyQt4 UI code generator 4.8.5
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+ _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+ _fromUtf8 = lambda s: s
+
+class Ui_Form(object):
+ def setupUi(self, Form):
+ Form.setObjectName(_fromUtf8("Form"))
+ Form.resize(400, 300)
+ Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
+ self.gridLayout = QtGui.QGridLayout(Form)
+ self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
+ self.plot = PlotWidget(Form)
+ self.plot.setObjectName(_fromUtf8("plot"))
+ self.gridLayout.addWidget(self.plot, 0, 0, 1, 2)
+ self.identicalCheck = QtGui.QCheckBox(Form)
+ self.identicalCheck.setText(QtGui.QApplication.translate("Form", "Identical", None, QtGui.QApplication.UnicodeUTF8))
+ self.identicalCheck.setObjectName(_fromUtf8("identicalCheck"))
+ self.gridLayout.addWidget(self.identicalCheck, 1, 0, 1, 1)
+ self.pixelModeCheck = QtGui.QCheckBox(Form)
+ self.pixelModeCheck.setText(QtGui.QApplication.translate("Form", "pixel mode", None, QtGui.QApplication.UnicodeUTF8))
+ self.pixelModeCheck.setObjectName(_fromUtf8("pixelModeCheck"))
+ self.gridLayout.addWidget(self.pixelModeCheck, 1, 1, 1, 1)
+
+ self.retranslateUi(Form)
+ QtCore.QMetaObject.connectSlotsByName(Form)
+
+ def retranslateUi(self, Form):
+ pass
+
+from pyqtgraph import PlotWidget
diff --git a/examples/SpinBox.py b/examples/SpinBox.py
new file mode 100644
index 00000000..1d8443d6
--- /dev/null
+++ b/examples/SpinBox.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+import initExample ## Add path to library (just for examples; you do not need this)
+
+import pyqtgraph as pg
+from pyqtgraph.Qt import QtCore, QtGui
+import numpy as np
+
+
+app = QtGui.QApplication([])
+
+
+spins = [
+ ("Floating-point spin box, min=0, no maximum.", pg.SpinBox(value=5.0, bounds=[0, None])),
+ ("Integer spin box, dec stepping
(1-9, 10-90, 100-900, etc)", pg.SpinBox(value=10, int=True, dec=True, minStep=1, step=1)),
+ ("Float with SI-prefixed units
(n, u, m, k, M, etc)", pg.SpinBox(value=0.9, suffix='V', siPrefix=True)),
+ ("Float with SI-prefixed units,
dec step=0.1, minStep=0.1", pg.SpinBox(value=1.0, suffix='V', siPrefix=True, dec=True, step=0.1, minStep=0.1)),
+ ("Float with SI-prefixed units,
dec step=0.5, minStep=0.01", pg.SpinBox(value=1.0, suffix='V', siPrefix=True, dec=True, step=0.5, minStep=0.01)),
+ ("Float with SI-prefixed units,
dec step=1.0, minStep=0.001", pg.SpinBox(value=1.0, suffix='V', siPrefix=True, dec=True, step=1.0, minStep=0.001)),
+]
+
+
+win = QtGui.QMainWindow()
+cw = QtGui.QWidget()
+layout = QtGui.QGridLayout()
+cw.setLayout(layout)
+win.setCentralWidget(cw)
+win.show()
+#win.resize(300, 600)
+changingLabel = QtGui.QLabel() ## updated immediately
+changedLabel = QtGui.QLabel() ## updated only when editing is finished or mouse wheel has stopped for 0.3sec
+changingLabel.setMinimumWidth(200)
+font = changingLabel.font()
+font.setBold(True)
+font.setPointSize(14)
+changingLabel.setFont(font)
+changedLabel.setFont(font)
+labels = []
+
+
+def valueChanged(sb):
+ changedLabel.setText("Final value: %s" % str(sb.value()))
+
+def valueChanging(sb, value):
+ changingLabel.setText("Value changing: %s" % str(sb.value()))
+
+
+for text, spin in spins:
+ label = QtGui.QLabel(text)
+ labels.append(label)
+ layout.addWidget(label)
+ layout.addWidget(spin)
+ spin.sigValueChanged.connect(valueChanged)
+ spin.sigValueChanging.connect(valueChanging)
+
+layout.addWidget(changingLabel, 0, 1)
+layout.addWidget(changedLabel, 2, 1)
+
+
+#def mkWin():
+ #win = QtGui.QMainWindow()
+ #g = QtGui.QFormLayout()
+ #w = QtGui.QWidget()
+ #w.setLayout(g)
+ #win.setCentralWidget(w)
+ #s1 = SpinBox(value=5, step=0.1, bounds=[-1.5, None], suffix='units')
+ #t1 = QtGui.QLineEdit()
+ #g.addRow(s1, t1)
+ #s2 = SpinBox(value=10e-6, dec=True, step=0.1, minStep=1e-6, suffix='A', siPrefix=True)
+ #t2 = QtGui.QLineEdit()
+ #g.addRow(s2, t2)
+ #s3 = SpinBox(value=1000, dec=True, step=0.5, minStep=1e-6, bounds=[1, 1e9], suffix='Hz', siPrefix=True)
+ #t3 = QtGui.QLineEdit()
+ #g.addRow(s3, t3)
+ #s4 = SpinBox(int=True, dec=True, step=1, minStep=1, bounds=[-10, 1000])
+ #t4 = QtGui.QLineEdit()
+ #g.addRow(s4, t4)
+
+ #win.show()
+
+ #import sys
+ #for sb in [s1, s2, s3,s4]:
+
+ ##QtCore.QObject.connect(sb, QtCore.SIGNAL('valueChanged(double)'), lambda v: sys.stdout.write(str(sb) + " valueChanged\n"))
+ ##QtCore.QObject.connect(sb, QtCore.SIGNAL('editingFinished()'), lambda: sys.stdout.write(str(sb) + " editingFinished\n"))
+ #sb.sigValueChanged.connect(valueChanged)
+ #sb.sigValueChanging.connect(valueChanging)
+ #sb.editingFinished.connect(lambda: sys.stdout.write(str(sb) + " editingFinished\n"))
+ #return win, w, [s1, s2, s3, s4]
+#a = mkWin()
+
+
+#def test(n=100):
+ #for i in range(n):
+ #win, w, sb = mkWin()
+ #for s in sb:
+ #w.setParent(None)
+ #s.setParent(None)
+ #s.valueChanged.disconnect()
+ #s.editingFinished.disconnect()
+
+
+## Start Qt event loop unless running in interactive mode or using pyside.
+import sys
+if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+ QtGui.QApplication.instance().exec_()
diff --git a/examples/TreeWidget.py b/examples/TreeWidget.py
new file mode 100644
index 00000000..c5d70150
--- /dev/null
+++ b/examples/TreeWidget.py
@@ -0,0 +1,45 @@
+# -*- coding: utf-8 -*-
+import initExample ## Add path to library (just for examples; you do not need this)
+
+import pyqtgraph as pg
+from pyqtgraph.Qt import QtCore, QtGui
+import numpy as np
+
+
+app = QtGui.QApplication([])
+
+w = pg.TreeWidget()
+w.setColumnCount(2)
+w.show()
+
+i1 = QtGui.QTreeWidgetItem(["Item 1"])
+i11 = QtGui.QTreeWidgetItem(["Item 1.1"])
+i12 = QtGui.QTreeWidgetItem(["Item 1.2"])
+i2 = QtGui.QTreeWidgetItem(["Item 2"])
+i21 = QtGui.QTreeWidgetItem(["Item 2.1"])
+i211 = QtGui.QTreeWidgetItem(["Item 2.1.1"])
+i212 = QtGui.QTreeWidgetItem(["Item 2.1.2"])
+i22 = QtGui.QTreeWidgetItem(["Item 2.2"])
+i3 = QtGui.QTreeWidgetItem(["Item 3"])
+i4 = QtGui.QTreeWidgetItem(["Item 4"])
+i5 = QtGui.QTreeWidgetItem(["Item 5"])
+
+w.addTopLevelItem(i1)
+w.addTopLevelItem(i2)
+w.addTopLevelItem(i3)
+w.addTopLevelItem(i4)
+w.addTopLevelItem(i5)
+i1.addChild(i11)
+i1.addChild(i12)
+i2.addChild(i21)
+i21.addChild(i211)
+i21.addChild(i212)
+i2.addChild(i22)
+
+b1 = QtGui.QPushButton("B1")
+w.setItemWidget(i1, 1, b1)
+
+## Start Qt event loop unless running in interactive mode or using pyside.
+import sys
+if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+ QtGui.QApplication.instance().exec_()
diff --git a/examples/__main__.py b/examples/__main__.py
index 75d3301e..0881fcea 100644
--- a/examples/__main__.py
+++ b/examples/__main__.py
@@ -22,7 +22,7 @@ examples = OrderedDict([
('IsocurveItem', 'isocurve.py'),
('ImageItem - video', 'ImageItem.py'),
('ImageItem - draw', 'Draw.py'),
- ('Region-of-Interest', 'ROItypes.py'),
+ ('Region-of-Interest', 'ROIExamples.py'),
('GraphicsLayout', 'GraphicsLayout.py'),
('Text Item', 'text.py'),
('Linked Views', 'linkedViews.py'),
@@ -35,12 +35,12 @@ examples = OrderedDict([
])),
('Widgets', OrderedDict([
('PlotWidget', 'PlotWidget.py'),
- #('SpinBox', '../widgets/SpinBox.py'),
- ('TreeWidget', '../widgets/TreeWidget.py'),
- ('DataTreeWidget', '../widgets/DataTreeWidget.py'),
+ ('SpinBox', 'SpinBox.py'),
+ ('TreeWidget', 'TreeWidget.py'),
+ ('DataTreeWidget', 'DataTreeWidget.py'),
('GradientWidget', 'GradientWidget.py'),
#('TableWidget', '../widgets/TableWidget.py'),
- ('ColorButton', '../widgets/ColorButton.py'),
+ ('ColorButton', 'ColorButton.py'),
#('CheckTable', '../widgets/CheckTable.py'),
#('VerticalLabel', '../widgets/VerticalLabel.py'),
('JoystickButton', 'JoystickButton.py'),