Bugfixes:
- ArrowItem auto range now works correctly - Dock drag/drop fixed on PySide - Made padding behavior consistent across ViewBox methods - Fixed MeshData / python2.6 incompatibility - Fixed ScatterPlotItem.setSize and .setPointData - Workaround for PySide bug; GradientEditor fixed - Prefer initially selecting PlotItem rather then ViewBox when exporting - Fixed python3 import error with flowcharts Cleaned up examples, made code editable from example loader Minor documentation updates
This commit is contained in:
commit
03683a5ef6
@ -17,7 +17,7 @@ Pyqtgraph makes it very easy to visualize data from the command line. Observe::
|
||||
import pyqtgraph as pg
|
||||
pg.plot(data) # data can be a list of values or a numpy array
|
||||
|
||||
The example above would open a window displaying a line plot of the data given. The call to :func:`pg.plot <pyqtgraph.plot>` returns a handle to the :class:`plot widget <pyqtgraph.PlotWidget>` that is created, allowing more data to be added to the same window.
|
||||
The example above would open a window displaying a line plot of the data given. The call to :func:`pg.plot <pyqtgraph.plot>` returns a handle to the :class:`plot widget <pyqtgraph.PlotWidget>` that is created, allowing more data to be added to the same window. **Note:** interactive plotting from the python prompt is only available with PyQt; PySide does not run the Qt event loop while the interactive prompt is running. If you wish to use pyqtgraph interactively with PySide, see the 'console' :ref:`example <examples>`.
|
||||
|
||||
Further examples::
|
||||
|
||||
|
@ -66,6 +66,12 @@ Signals, Slots, and Events
|
||||
|
||||
[ to be continued.. please post a request on the pyqtgraph forum if you'd like to read more ]
|
||||
|
||||
Qt detects and reacts to user interaction by executing its *event loop*.
|
||||
|
||||
- what happens in the event loop?
|
||||
- when do I need to use QApplication.exec_() ?
|
||||
- what control do I have over event loop execution? (QApplication.processEvents)
|
||||
|
||||
|
||||
GraphicsView and GraphicsItems
|
||||
------------------------------
|
||||
@ -79,8 +85,8 @@ Mouse and Keyboard Input
|
||||
------------------------
|
||||
|
||||
|
||||
QTimer, the Event Loop, and Multi-Threading
|
||||
-------------------------------------------
|
||||
QTimer, Multi-Threading
|
||||
-----------------------
|
||||
|
||||
|
||||
Multi-threading vs Multi-processing in Qt
|
||||
|
@ -1,11 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Display an animated arrowhead following a curve.
|
||||
This example uses the CurveArrow class, which is a combination
|
||||
of ArrowItem and CurvePoint.
|
||||
|
||||
## Display an animated arrowhead following a curve.
|
||||
## This example uses the CurveArrow class, which is a combination
|
||||
## of ArrowItem and CurvePoint.
|
||||
##
|
||||
## To place a static arrow anywhere in a scene, use ArrowItem.
|
||||
## To attach other types of item to a curve, use CurvePoint.
|
||||
To place a static arrow anywhere in a scene, use ArrowItem.
|
||||
To attach other types of item to a curve, use CurvePoint.
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
@ -21,6 +22,7 @@ cw = pg.GraphicsLayoutWidget()
|
||||
w.show()
|
||||
w.resize(400,600)
|
||||
w.setCentralWidget(cw)
|
||||
w.setWindowTitle('pyqtgraph example: Arrow')
|
||||
|
||||
p = cw.addPlot(row=0, col=0)
|
||||
p2 = cw.addPlot(row=1, col=0)
|
||||
|
@ -1,21 +1,26 @@
|
||||
"""
|
||||
Display a plot and an image with minimal setup.
|
||||
|
||||
pg.plot() and pg.image() are indended to be used from an interactive prompt
|
||||
to allow easy data inspection (but note that PySide unfortunately does not
|
||||
call the Qt event loop while the interactive prompt is running, in this case
|
||||
it is necessary to call QApplication.exec_() to make the windows appear).
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
from pyqtgraph.Qt import QtGui, QtCore
|
||||
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
|
||||
|
||||
data = np.random.normal(size=1000)
|
||||
pg.plot(data, title="Simplest possible plotting example")
|
||||
|
||||
data = np.random.normal(size=(500,500))
|
||||
pg.show(data, title="Simplest possible image example")
|
||||
pg.image(data, title="Simplest possible image example")
|
||||
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
if sys.flags.interactive != 1 or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||
app.exec_()
|
||||
pg.QtGui.QApplication.exec_()
|
||||
|
@ -1,11 +1,12 @@
|
||||
# -*- 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 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
|
||||
@ -15,6 +16,7 @@ win = QtGui.QMainWindow()
|
||||
btn = pg.ColorButton()
|
||||
win.setCentralWidget(btn)
|
||||
win.show()
|
||||
win.setWindowTitle('pyqtgraph example: ColorButton')
|
||||
|
||||
def change(btn):
|
||||
print("change", btn.color())
|
||||
|
@ -1,4 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
ConsoleWidget is used to allow execution of user-supplied python commands
|
||||
in an application. It also includes a command history and functionality for trapping
|
||||
and inspecting stack traces.
|
||||
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
@ -21,6 +27,7 @@ Go, play.
|
||||
"""
|
||||
c = pyqtgraph.console.ConsoleWidget(namespace=namespace, text=text)
|
||||
c.show()
|
||||
c.setWindowTitle('pyqtgraph example: ConsoleWidget')
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
|
@ -1,4 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrate a simple data-slicing task: given 3D data (displayed at top), select
|
||||
a 2D plane and interpolate data along that plane to generate a slice image
|
||||
(displayed at bottom).
|
||||
|
||||
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -12,6 +20,7 @@ app = QtGui.QApplication([])
|
||||
## Create window with two ImageView widgets
|
||||
win = QtGui.QMainWindow()
|
||||
win.resize(800,800)
|
||||
win.setWindowTitle('pyqtgraph example: DataSlicing')
|
||||
cw = QtGui.QWidget()
|
||||
win.setCentralWidget(cw)
|
||||
l = QtGui.QGridLayout()
|
||||
|
@ -4,8 +4,6 @@
|
||||
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
|
||||
@ -26,6 +24,7 @@ d = {
|
||||
|
||||
tree = pg.DataTreeWidget(data=d)
|
||||
tree.show()
|
||||
tree.setWindowTitle('pyqtgraph example: DataTreeWidget')
|
||||
tree.resize(600,600)
|
||||
|
||||
|
||||
|
@ -1,4 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrate ability of ImageItem to be used as a canvas for painting with
|
||||
the mouse.
|
||||
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
|
||||
@ -12,6 +18,7 @@ app = QtGui.QApplication([])
|
||||
w = pg.GraphicsView()
|
||||
w.show()
|
||||
w.resize(800,800)
|
||||
w.setWindowTitle('pyqtgraph example: Draw')
|
||||
|
||||
view = pg.ViewBox()
|
||||
w.setCentralItem(view)
|
||||
|
@ -21,6 +21,7 @@ top = np.linspace(1.0, 3.0, 10)
|
||||
bottom = np.linspace(2, 0.5, 10)
|
||||
|
||||
plt = pg.plot()
|
||||
plt.setWindowTitle('pyqtgraph example: ErrorBarItem')
|
||||
err = pg.ErrorBarItem(x=x, y=y, top=top, bottom=bottom, beam=0.5)
|
||||
plt.addItem(err)
|
||||
plt.plot(x, y, symbol='o', pen={'color': 0.8, 'width': 2})
|
||||
|
@ -23,6 +23,7 @@ app = QtGui.QApplication([])
|
||||
|
||||
## Create main window with grid layout
|
||||
win = QtGui.QMainWindow()
|
||||
win.setWindowTitle('pyqtgraph example: Flowchart')
|
||||
cw = QtGui.QWidget()
|
||||
win.setCentralWidget(cw)
|
||||
layout = QtGui.QGridLayout()
|
||||
|
@ -18,6 +18,7 @@ app = QtGui.QApplication([])
|
||||
|
||||
## Create main window with a grid layout inside
|
||||
win = QtGui.QMainWindow()
|
||||
win.setWindowTitle('pyqtgraph example: FlowchartCustomNode')
|
||||
cw = QtGui.QWidget()
|
||||
win.setCentralWidget(cw)
|
||||
layout = QtGui.QGridLayout()
|
||||
|
@ -1,4 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Use GLImageItem to display image data on rectangular planes.
|
||||
|
||||
In this example, the image data is sampled from a volume and the image planes
|
||||
placed as if they slice through the volume.
|
||||
"""
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -12,6 +18,7 @@ app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 200
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLImageItem')
|
||||
|
||||
## create volume data set to slice three images from
|
||||
shape = (100,100,70)
|
||||
|
@ -1,7 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
## This example uses the isosurface function to convert a scalar field
|
||||
## (a hydrogen orbital) into a mesh for 3D display.
|
||||
"""
|
||||
This example uses the isosurface function to convert a scalar field
|
||||
(a hydrogen orbital) into a mesh for 3D display.
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
@ -13,6 +14,7 @@ import pyqtgraph.opengl as gl
|
||||
app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLIsosurface')
|
||||
|
||||
w.setCameraPosition(distance=40)
|
||||
|
||||
|
@ -1,4 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrate use of GLLinePlotItem to draw cross-sections of a surface.
|
||||
|
||||
"""
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -11,6 +15,7 @@ app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 40
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLLinePlotItem')
|
||||
|
||||
gx = gl.GLGridItem()
|
||||
gx.rotate(90, 0, 1, 0)
|
||||
|
@ -14,7 +14,7 @@ import pyqtgraph.opengl as gl
|
||||
app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
|
||||
w.setWindowTitle('pyqtgraph example: GLMeshItem')
|
||||
w.setCameraPosition(distance=40)
|
||||
|
||||
g = gl.GLGridItem()
|
||||
|
@ -1,4 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates use of GLScatterPlotItem with rapidly-updating plots.
|
||||
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -10,6 +15,7 @@ app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 20
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLScatterPlotItem')
|
||||
|
||||
g = gl.GLGridItem()
|
||||
w.addItem(g)
|
||||
|
@ -17,6 +17,7 @@ import numpy as np
|
||||
app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLSurfacePlot')
|
||||
w.setCameraPosition(distance=50)
|
||||
|
||||
## Add a grid to the view
|
||||
|
@ -1,4 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Very basic 3D graphics example; create a view widget and add a few items.
|
||||
|
||||
"""
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -9,6 +13,7 @@ app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 20
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GLViewWidget')
|
||||
|
||||
ax = gl.GLAxisItem()
|
||||
ax.setSize(5,5,5)
|
||||
|
@ -1,4 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates GLVolumeItem for displaying volumetric data.
|
||||
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -9,7 +14,7 @@ app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.opts['distance'] = 200
|
||||
w.show()
|
||||
|
||||
w.setWindowTitle('pyqtgraph example: GLVolumeItem')
|
||||
|
||||
#b = gl.GLBoxItem()
|
||||
#w.addItem(b)
|
||||
|
@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstration of some of the shader programs included with pyqtgraph.
|
||||
Demonstration of some of the shader programs included with pyqtgraph that can be
|
||||
used to affect the appearance of a surface.
|
||||
"""
|
||||
|
||||
|
||||
@ -15,7 +16,7 @@ import pyqtgraph.opengl as gl
|
||||
app = QtGui.QApplication([])
|
||||
w = gl.GLViewWidget()
|
||||
w.show()
|
||||
|
||||
w.setWindowTitle('pyqtgraph example: GL Shaders')
|
||||
w.setCameraPosition(distance=15, azimuth=-90)
|
||||
|
||||
g = gl.GLGridItem()
|
||||
|
@ -1,4 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates the appearance / interactivity of GradientWidget
|
||||
(without actually doing anything useful with it)
|
||||
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
@ -10,6 +15,7 @@ import numpy as np
|
||||
app = QtGui.QApplication([])
|
||||
w = QtGui.QMainWindow()
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: GradientWidget')
|
||||
w.resize(400,400)
|
||||
cw = QtGui.QWidget()
|
||||
w.setCentralWidget(cw)
|
||||
|
@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Simple example of GridItem use.
|
||||
Simple example of GraphItem use.
|
||||
"""
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@ from pyqtgraph.Qt import QtCore, QtGui
|
||||
import numpy as np
|
||||
|
||||
w = pg.GraphicsWindow()
|
||||
w.setWindowTitle('pyqtgraph example: GraphItem')
|
||||
v = w.addViewBox()
|
||||
v.setAspectLocked()
|
||||
|
||||
|
@ -1,3 +1,10 @@
|
||||
"""
|
||||
Demonstrate the use of layouts to control placement of multiple plots / views /
|
||||
labels
|
||||
|
||||
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -10,6 +17,7 @@ view = pg.GraphicsView()
|
||||
l = pg.GraphicsLayout(border=(100,100,100))
|
||||
view.setCentralItem(l)
|
||||
view.show()
|
||||
view.setWindowTitle('pyqtgraph example: GraphicsLayout')
|
||||
view.resize(800,600)
|
||||
|
||||
## Title at top
|
||||
|
@ -1,4 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Use a HistogramLUTWidget to control the contrast / coloration of an image.
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -12,6 +16,7 @@ app = QtGui.QApplication([])
|
||||
win = QtGui.QMainWindow()
|
||||
win.resize(800,600)
|
||||
win.show()
|
||||
win.setWindowTitle('pyqtgraph example: Histogram LUT')
|
||||
|
||||
cw = QtGui.QWidget()
|
||||
win.setCentralWidget(cw)
|
||||
|
@ -1,4 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates very basic use of ImageItem to display image data inside a ViewBox.
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -10,19 +14,17 @@ import pyqtgraph.ptime as ptime
|
||||
app = QtGui.QApplication([])
|
||||
|
||||
## Create window with GraphicsView widget
|
||||
view = pg.GraphicsView()
|
||||
view.show() ## show view alone in its own window
|
||||
|
||||
## Allow mouse scale/pan. Normally we use a ViewBox for this, but
|
||||
## for simple examples this is easier.
|
||||
view.enableMouse()
|
||||
win = pg.GraphicsLayoutWidget()
|
||||
win.show() ## show widget alone in its own window
|
||||
win.setWindowTitle('pyqtgraph example: ImageItem')
|
||||
view = win.addViewBox()
|
||||
|
||||
## lock the aspect ratio so pixels are always square
|
||||
view.setAspectLocked(True)
|
||||
|
||||
## Create image item
|
||||
img = pg.ImageItem(border='w')
|
||||
view.scene().addItem(img)
|
||||
view.addItem(img)
|
||||
|
||||
## Set initial view bounds
|
||||
view.setRange(QtCore.QRectF(0, 0, 600, 600))
|
||||
|
@ -1,4 +1,15 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This example demonstrates the use of ImageView, which is a high-level widget for
|
||||
displaying and analyzing 2D and 3D data. ImageView provides:
|
||||
|
||||
1. A zoomable region (ViewBox) for displaying the image
|
||||
2. A combination histogram and gradient editor (HistogramLUTItem) for
|
||||
controlling the visual appearance of the image
|
||||
3. A timeline for selecting the currently displayed frame (for 3D data only).
|
||||
4. Tools for very basic analysis of image data (see ROI and Norm buttons)
|
||||
|
||||
"""
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -15,6 +26,7 @@ win.resize(800,800)
|
||||
imv = pg.ImageView()
|
||||
win.setCentralWidget(imv)
|
||||
win.show()
|
||||
win.setWindowTitle('pyqtgraph example: ImageView')
|
||||
|
||||
## Create random 3D data set with noisy signals
|
||||
img = scipy.ndimage.gaussian_filter(np.random.normal(size=(200, 200)), (5, 5)) * 20 + 100
|
||||
@ -22,9 +34,6 @@ img = img[np.newaxis,:,:]
|
||||
decay = np.exp(-np.linspace(0,0.3,100))[:,np.newaxis,np.newaxis]
|
||||
data = np.random.normal(size=(100, 200, 200))
|
||||
data += img * decay
|
||||
|
||||
#for i in range(data.shape[0]):
|
||||
#data[i] += 10*exp(-(2.*i)/data.shape[0])
|
||||
data += 2
|
||||
|
||||
## Add time-varying signal
|
||||
@ -37,7 +46,7 @@ sig = sig[:,np.newaxis,np.newaxis] * 3
|
||||
data[:,50:60,50:60] += sig
|
||||
|
||||
|
||||
## Display the data
|
||||
## Display the data and assign each frame a time value from 1.0 to 3.0
|
||||
imv.setImage(data, xvals=np.linspace(1., 3., data.shape[0]))
|
||||
|
||||
## Start Qt event loop unless running in interactive mode.
|
||||
|
@ -1,7 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
JoystickButton is a button with x/y values. When the button is depressed and the mouse dragged, the x/y values change to follow the mouse.
|
||||
When the mouse button is released, the x/y values change to 0,0 (rather like litting go of the joystick).
|
||||
JoystickButton is a button with x/y values. When the button is depressed and the
|
||||
mouse dragged, the x/y values change to follow the mouse.
|
||||
When the mouse button is released, the x/y values change to 0,0 (rather like
|
||||
letting go of the joystick).
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
@ -13,6 +15,7 @@ import pyqtgraph as pg
|
||||
app = QtGui.QApplication([])
|
||||
mw = QtGui.QMainWindow()
|
||||
mw.resize(300,50)
|
||||
mw.setWindowTitle('pyqtgraph example: JoystickButton')
|
||||
cw = QtGui.QWidget()
|
||||
mw.setCentralWidget(cw)
|
||||
layout = QtGui.QGridLayout()
|
||||
|
@ -1,11 +1,15 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates basic use of LegendItem
|
||||
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtCore, QtGui
|
||||
|
||||
plt = pg.plot()
|
||||
|
||||
plt.setWindowTitle('pyqtgraph example: Legend')
|
||||
plt.addLegend()
|
||||
#l = pg.LegendItem((100,60), offset=(70,30)) # args are (size, offset)
|
||||
#l.setParentItem(plt.graphicsItem()) # Note we do NOT call plt.addItem in this case
|
||||
|
@ -1,9 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
## This example demonstrates many of the 2D plotting capabilities
|
||||
## in pyqtgraph. All of the plots may be panned/scaled by dragging with
|
||||
## the left/right mouse buttons. Right click on any plot to show a context menu.
|
||||
|
||||
"""
|
||||
Simple logarithmic plotting test
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
@ -12,14 +10,11 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
#mw = QtGui.QMainWindow()
|
||||
#mw.resize(800,800)
|
||||
|
||||
win = pg.GraphicsWindow(title="Basic plotting examples")
|
||||
win.resize(1000,600)
|
||||
|
||||
win.setWindowTitle('pyqtgraph example: LogPlotTest')
|
||||
|
||||
|
||||
p5 = win.addPlot(title="Scatter plot, axis labels, log scale")
|
||||
|
@ -1,5 +1,9 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Test the speed of rapidly updating multiple plot curves
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -14,6 +18,7 @@ app = QtGui.QApplication([])
|
||||
#mw.resize(800,800)
|
||||
|
||||
p = pg.plot()
|
||||
p.setWindowTitle('pyqtgraph example: MultiPlotSpeedTest')
|
||||
#p.setRange(QtCore.QRectF(0, -10, 5000, 20))
|
||||
p.setLabel('bottom', 'Index', units='B')
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
## This example demonstrates the different auto-ranging capabilities of ViewBoxes
|
||||
|
||||
"""
|
||||
This example demonstrates the different auto-ranging capabilities of ViewBoxes
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
@ -17,7 +18,7 @@ app = QtGui.QApplication([])
|
||||
|
||||
win = pg.GraphicsWindow(title="Plot auto-range examples")
|
||||
win.resize(800,600)
|
||||
|
||||
win.setWindowTitle('pyqtgraph example: PlotAutoRange')
|
||||
|
||||
d = np.random.normal(size=100)
|
||||
d[50:54] += 10
|
||||
|
@ -1,5 +1,9 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Update a simple plot as rapidly as possible to measure speed.
|
||||
"""
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -8,12 +12,10 @@ from pyqtgraph.Qt import QtGui, QtCore
|
||||
import numpy as np
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.ptime import time
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
#mw = QtGui.QMainWindow()
|
||||
#mw.resize(800,800)
|
||||
|
||||
p = pg.plot()
|
||||
p.setWindowTitle('pyqtgraph example: PlotSpeedTest')
|
||||
p.setRange(QtCore.QRectF(0, -10, 5000, 20))
|
||||
p.setLabel('bottom', 'Index', units='B')
|
||||
curve = p.plot()
|
||||
|
@ -1,4 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates use of PlotWidget class. This is little more than a
|
||||
GraphicsView with a PlotItem placed in its center.
|
||||
"""
|
||||
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
|
||||
@ -9,6 +15,7 @@ import pyqtgraph as pg
|
||||
#QtGui.QApplication.setGraphicsSystem('raster')
|
||||
app = QtGui.QApplication([])
|
||||
mw = QtGui.QMainWindow()
|
||||
mw.setWindowTitle('pyqtgraph example: PlotWidget')
|
||||
mw.resize(800,800)
|
||||
cw = QtGui.QWidget()
|
||||
mw.setCentralWidget(cw)
|
||||
@ -66,6 +73,7 @@ for i in range(0, 5):
|
||||
|
||||
## Test large numbers
|
||||
curve = pw3.plot(np.random.normal(size=100)*1e0, clickable=True)
|
||||
curve.curve.setClickable(True)
|
||||
curve.setPen('w') ## white pen
|
||||
curve.setShadowPen(pg.mkPen((70,70,30), width=6, cosmetic=True))
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
## This example demonstrates many of the 2D plotting capabilities
|
||||
## in pyqtgraph. All of the plots may be panned/scaled by dragging with
|
||||
## the left/right mouse buttons. Right click on any plot to show a context menu.
|
||||
|
||||
"""
|
||||
This example demonstrates many of the 2D plotting capabilities
|
||||
in pyqtgraph. All of the plots may be panned/scaled by dragging with
|
||||
the left/right mouse buttons. Right click on any plot to show a context menu.
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
@ -19,6 +19,7 @@ app = QtGui.QApplication([])
|
||||
|
||||
win = pg.GraphicsWindow(title="Basic plotting examples")
|
||||
win.resize(1000,600)
|
||||
win.setWindowTitle('pyqtgraph example: Plotting')
|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Demonstrates a variety of uses for ROI. This class provides a user-adjustable
|
||||
region of interest marker. It is possible to customize the layout and
|
||||
function of the scale/rotate handles in very flexible ways.
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
@ -22,6 +28,7 @@ arr += np.random.normal(size=(100,100))
|
||||
## create GUI
|
||||
app = QtGui.QApplication([])
|
||||
w = pg.GraphicsWindow(size=(800,800), border=True)
|
||||
w.setWindowTitle('pyqtgraph example: ROI Examples')
|
||||
|
||||
text = """Data Selection From Image.<br>\n
|
||||
Drag an ROI or its handles to update the selected image.<br>
|
||||
|
@ -1,18 +1,25 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Very simple example demonstrating RemoteGraphicsView
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
from pyqtgraph.Qt import QtGui, QtCore
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph.widgets.RemoteGraphicsView import RemoteGraphicsView
|
||||
app = pg.mkQApp()
|
||||
|
||||
v = pg.RemoteGraphicsView()
|
||||
v = RemoteGraphicsView()
|
||||
v.show()
|
||||
v.setWindowTitle('pyqtgraph example: RemoteGraphicsView')
|
||||
|
||||
## v.pg is a proxy to the remote process' pyqtgraph module. All attribute
|
||||
## requests and function calls made with this object are forwarded to the
|
||||
## remote process and executed there.
|
||||
plt = v.pg.PlotItem()
|
||||
v.setCentralItem(plt)
|
||||
plt.plot([1,4,2,3,6,2,3,4,2,3], pen='g')
|
||||
|
||||
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
@ -22,6 +22,7 @@ app = pg.mkQApp()
|
||||
view = pg.widgets.RemoteGraphicsView.RemoteGraphicsView()
|
||||
pg.setConfigOptions(antialias=True) ## this will be expensive for the local plot
|
||||
view.pg.setConfigOptions(antialias=True) ## prettier plots at no cost to the main process!
|
||||
view.setWindowTitle('pyqtgraph example: RemoteSpeedTest')
|
||||
|
||||
label = QtGui.QLabel()
|
||||
rcheck = QtGui.QCheckBox('plot remote')
|
||||
|
@ -1,4 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Example demonstrating a variety of scatter plot features.
|
||||
"""
|
||||
|
||||
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -12,6 +18,7 @@ mw.resize(800,800)
|
||||
view = pg.GraphicsLayoutWidget() ## GraphicsView with GraphicsLayout inserted by default
|
||||
mw.setCentralWidget(view)
|
||||
mw.show()
|
||||
mw.setWindowTitle('pyqtgraph example: ScatterPlot')
|
||||
|
||||
## create four areas to add plots
|
||||
w1 = view.addPlot()
|
||||
|
@ -1,5 +1,13 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
For testing rapid updates of ScatterPlotItem under various conditions.
|
||||
|
||||
(Scatter plots are still rather slow to draw; expect about 20fps)
|
||||
"""
|
||||
|
||||
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -18,6 +26,7 @@ else:
|
||||
from ScatterPlotSpeedTestTemplate_pyqt import Ui_Form
|
||||
|
||||
win = QtGui.QWidget()
|
||||
win.setWindowTitle('pyqtgraph example: ScatterPlotSpeedTest')
|
||||
ui = Ui_Form()
|
||||
ui.setupUi(win)
|
||||
win.show()
|
||||
|
@ -1,4 +1,13 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This example demonstrates the SpinBox widget, which is an extension of
|
||||
QDoubleSpinBox providing some advanced features:
|
||||
|
||||
* SI-prefixed units
|
||||
* Non-linear stepping modes
|
||||
* Bounded/unbounded values
|
||||
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
@ -20,6 +29,7 @@ spins = [
|
||||
|
||||
|
||||
win = QtGui.QMainWindow()
|
||||
win.setWindowTitle('pyqtgraph example: SpinBox')
|
||||
cw = QtGui.QWidget()
|
||||
layout = QtGui.QGridLayout()
|
||||
cw.setLayout(layout)
|
||||
|
@ -1,4 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Simple demonstration of TreeWidget, which is an extension of QTreeWidget
|
||||
that allows widgets to be added and dragged within the tree more easily.
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
@ -11,6 +15,7 @@ app = QtGui.QApplication([])
|
||||
w = pg.TreeWidget()
|
||||
w.setColumnCount(2)
|
||||
w.show()
|
||||
w.setWindowTitle('pyqtgraph example: TreeWidget')
|
||||
|
||||
i1 = QtGui.QTreeWidgetItem(["Item 1"])
|
||||
i11 = QtGui.QTreeWidgetItem(["Item 1.1"])
|
||||
|
@ -29,6 +29,7 @@ app = QtGui.QApplication([])
|
||||
#mw.resize(800,800)
|
||||
|
||||
win = QtGui.QMainWindow()
|
||||
win.setWindowTitle('pyqtgraph example: VideoSpeedTest')
|
||||
ui = VideoTemplate.Ui_MainWindow()
|
||||
ui.setupUi(win)
|
||||
win.show()
|
||||
|
@ -1,5 +1,14 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
ViewBox is the general-purpose graphical container that allows the user to
|
||||
zoom / pan to inspect any area of a 2D coordinate system.
|
||||
|
||||
This unimaginative example demonstrates the constrution of a ViewBox-based
|
||||
plot area with axes, very similar to the way PlotItem is built.
|
||||
"""
|
||||
|
||||
|
||||
## Add path to library (just for examples; you do not need this)
|
||||
import initExample
|
||||
|
||||
@ -12,29 +21,22 @@ import pyqtgraph as pg
|
||||
|
||||
app = QtGui.QApplication([])
|
||||
mw = QtGui.QMainWindow()
|
||||
#cw = QtGui.QWidget()
|
||||
#vl = QtGui.QVBoxLayout()
|
||||
#cw.setLayout(vl)
|
||||
#mw.setCentralWidget(cw)
|
||||
mw.setWindowTitle('pyqtgraph example: ViewBox')
|
||||
mw.show()
|
||||
mw.resize(800, 600)
|
||||
|
||||
gv = pg.GraphicsView()
|
||||
mw.setCentralWidget(gv)
|
||||
#gv.enableMouse(False) ## Mouse interaction will be handled by the ViewBox
|
||||
l = QtGui.QGraphicsGridLayout()
|
||||
l.setHorizontalSpacing(0)
|
||||
l.setVerticalSpacing(0)
|
||||
#vl.addWidget(gv)
|
||||
|
||||
|
||||
vb = pg.ViewBox()
|
||||
#grid = pg.GridItem()
|
||||
#vb.addItem(grid)
|
||||
|
||||
p1 = pg.PlotDataItem()
|
||||
vb.addItem(p1)
|
||||
|
||||
## Just something to play with inside the ViewBox
|
||||
class movableRect(QtGui.QGraphicsRectItem):
|
||||
def __init__(self, *args):
|
||||
QtGui.QGraphicsRectItem.__init__(self, *args)
|
||||
@ -55,8 +57,6 @@ class movableRect(QtGui.QGraphicsRectItem):
|
||||
def mouseMoveEvent(self, ev):
|
||||
self.setPos(self.mapToParent(ev.pos()) - self.pressDelta)
|
||||
|
||||
|
||||
#rect = QtGui.QGraphicsRectItem(QtCore.QRectF(0, 0, 1, 1))
|
||||
rect = movableRect(QtCore.QRectF(0, 0, 1, 1))
|
||||
rect.setPen(QtGui.QPen(QtGui.QColor(100, 200, 100)))
|
||||
vb.addItem(rect)
|
||||
|
@ -22,6 +22,7 @@ examples = OrderedDict([
|
||||
('Dock widgets', 'dockarea.py'),
|
||||
('Console', 'ConsoleWidget.py'),
|
||||
('Histograms', 'histogram.py'),
|
||||
('Auto-range', 'PlotAutoRange.py'),
|
||||
('Remote Plotting', 'RemoteSpeedTest.py'),
|
||||
('GraphicsItems', OrderedDict([
|
||||
('Scatter Plot', 'ScatterPlot.py'),
|
||||
@ -38,6 +39,7 @@ examples = OrderedDict([
|
||||
('Linked Views', 'linkedViews.py'),
|
||||
('Arrow', 'Arrow.py'),
|
||||
('ViewBox', 'ViewBox.py'),
|
||||
('Custom Graphics', 'customGraphicsItem.py'),
|
||||
])),
|
||||
('Benchmarks', OrderedDict([
|
||||
('Video speed test', 'VideoSpeedTest.py'),
|
||||
@ -58,6 +60,7 @@ examples = OrderedDict([
|
||||
('PlotWidget', 'PlotWidget.py'),
|
||||
('SpinBox', 'SpinBox.py'),
|
||||
('ConsoleWidget', 'ConsoleWidget.py'),
|
||||
('Histogram / lookup table', 'HistogramLUT.py'),
|
||||
('TreeWidget', 'TreeWidget.py'),
|
||||
('DataTreeWidget', 'DataTreeWidget.py'),
|
||||
('GradientWidget', 'GradientWidget.py'),
|
||||
@ -68,7 +71,7 @@ examples = OrderedDict([
|
||||
('JoystickButton', 'JoystickButton.py'),
|
||||
])),
|
||||
|
||||
('GraphicsScene', 'GraphicsScene.py'),
|
||||
#('GraphicsScene', 'GraphicsScene.py'),
|
||||
('Flowcharts', 'Flowchart.py'),
|
||||
('Custom Flowchart Nodes', 'FlowchartCustomNode.py'),
|
||||
#('Canvas', '../canvas'),
|
||||
@ -85,6 +88,13 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
self.setCentralWidget(self.cw)
|
||||
self.ui.setupUi(self.cw)
|
||||
|
||||
self.codeBtn = QtGui.QPushButton('Run Edited Code')
|
||||
self.codeLayout = QtGui.QGridLayout()
|
||||
self.ui.codeView.setLayout(self.codeLayout)
|
||||
self.codeLayout.addItem(QtGui.QSpacerItem(100,100,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding), 0, 0)
|
||||
self.codeLayout.addWidget(self.codeBtn, 1, 1)
|
||||
self.codeBtn.hide()
|
||||
|
||||
global examples
|
||||
self.populateTree(self.ui.exampleTree.invisibleRootItem(), examples)
|
||||
self.ui.exampleTree.expandAll()
|
||||
@ -97,6 +107,8 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
self.ui.exampleTree.itemDoubleClicked.connect(self.loadFile)
|
||||
self.ui.pyqtCheck.toggled.connect(self.pyqtToggled)
|
||||
self.ui.pysideCheck.toggled.connect(self.pysideToggled)
|
||||
self.ui.codeView.textChanged.connect(self.codeEdited)
|
||||
self.codeBtn.clicked.connect(self.runEditedCode)
|
||||
|
||||
def pyqtToggled(self, b):
|
||||
if b:
|
||||
@ -124,8 +136,8 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
return os.path.join(path, item.file)
|
||||
return None
|
||||
|
||||
def loadFile(self):
|
||||
fn = self.currentFile()
|
||||
def loadFile(self, edited=False):
|
||||
|
||||
extra = []
|
||||
if self.ui.pyqtCheck.isChecked():
|
||||
extra.append('pyqt')
|
||||
@ -135,13 +147,26 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
if self.ui.forceGraphicsCheck.isChecked():
|
||||
extra.append(str(self.ui.forceGraphicsCombo.currentText()))
|
||||
|
||||
if fn is None:
|
||||
return
|
||||
if sys.platform.startswith('win'):
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
|
||||
else:
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
|
||||
|
||||
#if sys.platform.startswith('win'):
|
||||
#os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
|
||||
#else:
|
||||
#os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
|
||||
|
||||
if edited:
|
||||
path = os.path.abspath(os.path.dirname(__file__))
|
||||
proc = subprocess.Popen([sys.executable, '-'] + extra, stdin=subprocess.PIPE, cwd=path)
|
||||
code = str(self.ui.codeView.toPlainText()).encode('UTF-8')
|
||||
proc.stdin.write(code)
|
||||
proc.stdin.close()
|
||||
else:
|
||||
fn = self.currentFile()
|
||||
if fn is None:
|
||||
return
|
||||
if sys.platform.startswith('win'):
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
|
||||
else:
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
|
||||
|
||||
def showFile(self):
|
||||
fn = self.currentFile()
|
||||
@ -152,6 +177,14 @@ class ExampleLoader(QtGui.QMainWindow):
|
||||
fn = os.path.join(fn, '__main__.py')
|
||||
text = open(fn).read()
|
||||
self.ui.codeView.setPlainText(text)
|
||||
self.ui.loadedFileLabel.setText(fn)
|
||||
self.codeBtn.hide()
|
||||
|
||||
def codeEdited(self):
|
||||
self.codeBtn.show()
|
||||
|
||||
def runEditedCode(self):
|
||||
self.loadFile(edited=True)
|
||||
|
||||
def run():
|
||||
app = QtGui.QApplication([])
|
||||
|
@ -1,3 +1,10 @@
|
||||
"""
|
||||
Demonstrates some customized mouse interaction by drawing a crosshair that follows
|
||||
the mouse.
|
||||
|
||||
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
import numpy as np
|
||||
import scipy.ndimage as ndi
|
||||
@ -5,9 +12,10 @@ import pyqtgraph as pg
|
||||
from pyqtgraph.Qt import QtGui, QtCore
|
||||
from pyqtgraph.Point import Point
|
||||
|
||||
#genearte layout
|
||||
#generate layout
|
||||
app = QtGui.QApplication([])
|
||||
win = pg.GraphicsWindow()
|
||||
win.setWindowTitle('pyqtgraph example: crosshair')
|
||||
label = pg.LabelItem(justify='right')
|
||||
win.addItem(label)
|
||||
p1 = win.addPlot(row=1, col=0)
|
||||
|
@ -1,6 +1,15 @@
|
||||
"""
|
||||
Demonstrate creation of a custom graphic (a candlestick plot)
|
||||
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import pyqtgraph as pg
|
||||
from pyqtgraph import QtCore, QtGui
|
||||
|
||||
## Create a subclass of GraphicsObject.
|
||||
## The only required methods are paint() and boundingRect()
|
||||
## (see QGraphicsItem documentation)
|
||||
class CandlestickItem(pg.GraphicsObject):
|
||||
def __init__(self, data):
|
||||
pg.GraphicsObject.__init__(self)
|
||||
@ -8,6 +17,8 @@ class CandlestickItem(pg.GraphicsObject):
|
||||
self.generatePicture()
|
||||
|
||||
def generatePicture(self):
|
||||
## pre-computing a QPicture object allows paint() to run much more quickly,
|
||||
## rather than re-drawing the shapes every time.
|
||||
self.picture = QtGui.QPicture()
|
||||
p = QtGui.QPainter(self.picture)
|
||||
p.setPen(pg.mkPen('w'))
|
||||
@ -25,6 +36,9 @@ class CandlestickItem(pg.GraphicsObject):
|
||||
p.drawPicture(0, 0, self.picture)
|
||||
|
||||
def boundingRect(self):
|
||||
## boundingRect _must_ indicate the entire area that will be drawn on
|
||||
## or else we will get artifacts and possibly crashing.
|
||||
## (in this case, QPicture does all the work of computing the bouning rect for us)
|
||||
return QtCore.QRectF(self.picture.boundingRect())
|
||||
|
||||
data = [ ## fields are (time, open, close, min, max).
|
||||
@ -38,5 +52,10 @@ data = [ ## fields are (time, open, close, min, max).
|
||||
item = CandlestickItem(data)
|
||||
plt = pg.plot()
|
||||
plt.addItem(item)
|
||||
plt.setWindowTitle('pyqtgraph example: customGraphicsItem')
|
||||
|
||||
QtGui.QApplication.exec_()
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
||||
QtGui.QApplication.instance().exec_()
|
||||
|
@ -1,8 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##
|
||||
## This example demonstrates the creation of a plot with a customized
|
||||
## AxisItem and ViewBox.
|
||||
##
|
||||
"""
|
||||
This example demonstrates the creation of a plot with a customized
|
||||
AxisItem and ViewBox.
|
||||
"""
|
||||
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
@ -72,6 +72,7 @@ pw = pg.PlotWidget(viewBox=vb, axisItems={'bottom': axis}, enableMenu=False, tit
|
||||
dates = np.arange(8) * (3600*24*356)
|
||||
pw.plot(x=dates, y=[1,6,2,4,3,5,6,8], symbol='o')
|
||||
pw.show()
|
||||
pw.setWindowTitle('pyqtgraph example: customPlot')
|
||||
|
||||
r = pg.PolyLineROI([(0,0), (10, 10)])
|
||||
pw.addItem(r)
|
||||
|
@ -29,6 +29,7 @@ win = QtGui.QMainWindow()
|
||||
area = DockArea()
|
||||
win.setCentralWidget(area)
|
||||
win.resize(1000,500)
|
||||
win.setWindowTitle('pyqtgraph example: dockarea')
|
||||
|
||||
## Create docks, place them into the window one at a time.
|
||||
## Note that size arguments are only a suggestion; docks will still have to
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>762</width>
|
||||
<height>302</height>
|
||||
<width>623</width>
|
||||
<height>380</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -25,7 +25,7 @@
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<widget class="QWidget" name="">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="exampleTree">
|
||||
@ -90,19 +90,40 @@
|
||||
<item>
|
||||
<widget class="QPushButton" name="loadBtn">
|
||||
<property name="text">
|
||||
<string>Load Example</string>
|
||||
<string>Run Example</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QTextBrowser" name="codeView">
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Monospace</family>
|
||||
<pointsize>10</pointsize>
|
||||
</font>
|
||||
</property>
|
||||
<widget class="QWidget" name="">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="loadedFileLabel">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="codeView">
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>FreeMono</family>
|
||||
</font>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -1,9 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file './examples/exampleLoaderTemplate.ui'
|
||||
# Form implementation generated from reading ui file './exampleLoaderTemplate.ui'
|
||||
#
|
||||
# Created: Mon Dec 24 00:33:38 2012
|
||||
# by: PyQt4 UI code generator 4.9.1
|
||||
# Created: Mon Feb 25 09:02:09 2013
|
||||
# by: PyQt4 UI code generator 4.9.3
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
@ -17,7 +17,7 @@ except AttributeError:
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName(_fromUtf8("Form"))
|
||||
Form.resize(762, 302)
|
||||
Form.resize(623, 380)
|
||||
self.gridLayout = QtGui.QGridLayout(Form)
|
||||
self.gridLayout.setMargin(0)
|
||||
self.gridLayout.setSpacing(0)
|
||||
@ -25,46 +25,60 @@ class Ui_Form(object):
|
||||
self.splitter = QtGui.QSplitter(Form)
|
||||
self.splitter.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.splitter.setObjectName(_fromUtf8("splitter"))
|
||||
self.layoutWidget = QtGui.QWidget(self.splitter)
|
||||
self.layoutWidget.setObjectName(_fromUtf8("layoutWidget"))
|
||||
self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget)
|
||||
self.widget = QtGui.QWidget(self.splitter)
|
||||
self.widget.setObjectName(_fromUtf8("widget"))
|
||||
self.verticalLayout = QtGui.QVBoxLayout(self.widget)
|
||||
self.verticalLayout.setMargin(0)
|
||||
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
|
||||
self.exampleTree = QtGui.QTreeWidget(self.layoutWidget)
|
||||
self.exampleTree = QtGui.QTreeWidget(self.widget)
|
||||
self.exampleTree.setObjectName(_fromUtf8("exampleTree"))
|
||||
self.exampleTree.headerItem().setText(0, _fromUtf8("1"))
|
||||
self.exampleTree.header().setVisible(False)
|
||||
self.verticalLayout.addWidget(self.exampleTree)
|
||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
|
||||
self.pyqtCheck = QtGui.QCheckBox(self.layoutWidget)
|
||||
self.pyqtCheck = QtGui.QCheckBox(self.widget)
|
||||
self.pyqtCheck.setObjectName(_fromUtf8("pyqtCheck"))
|
||||
self.horizontalLayout.addWidget(self.pyqtCheck)
|
||||
self.pysideCheck = QtGui.QCheckBox(self.layoutWidget)
|
||||
self.pysideCheck = QtGui.QCheckBox(self.widget)
|
||||
self.pysideCheck.setObjectName(_fromUtf8("pysideCheck"))
|
||||
self.horizontalLayout.addWidget(self.pysideCheck)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
self.horizontalLayout_2 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
|
||||
self.forceGraphicsCheck = QtGui.QCheckBox(self.layoutWidget)
|
||||
self.forceGraphicsCheck = QtGui.QCheckBox(self.widget)
|
||||
self.forceGraphicsCheck.setObjectName(_fromUtf8("forceGraphicsCheck"))
|
||||
self.horizontalLayout_2.addWidget(self.forceGraphicsCheck)
|
||||
self.forceGraphicsCombo = QtGui.QComboBox(self.layoutWidget)
|
||||
self.forceGraphicsCombo = QtGui.QComboBox(self.widget)
|
||||
self.forceGraphicsCombo.setObjectName(_fromUtf8("forceGraphicsCombo"))
|
||||
self.forceGraphicsCombo.addItem(_fromUtf8(""))
|
||||
self.forceGraphicsCombo.addItem(_fromUtf8(""))
|
||||
self.forceGraphicsCombo.addItem(_fromUtf8(""))
|
||||
self.horizontalLayout_2.addWidget(self.forceGraphicsCombo)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout_2)
|
||||
self.loadBtn = QtGui.QPushButton(self.layoutWidget)
|
||||
self.loadBtn = QtGui.QPushButton(self.widget)
|
||||
self.loadBtn.setObjectName(_fromUtf8("loadBtn"))
|
||||
self.verticalLayout.addWidget(self.loadBtn)
|
||||
self.codeView = QtGui.QTextBrowser(self.splitter)
|
||||
self.widget1 = QtGui.QWidget(self.splitter)
|
||||
self.widget1.setObjectName(_fromUtf8("widget1"))
|
||||
self.verticalLayout_2 = QtGui.QVBoxLayout(self.widget1)
|
||||
self.verticalLayout_2.setMargin(0)
|
||||
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
|
||||
self.loadedFileLabel = QtGui.QLabel(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily(_fromUtf8("Monospace"))
|
||||
font.setPointSize(10)
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setText(_fromUtf8(""))
|
||||
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.loadedFileLabel.setObjectName(_fromUtf8("loadedFileLabel"))
|
||||
self.verticalLayout_2.addWidget(self.loadedFileLabel)
|
||||
self.codeView = QtGui.QPlainTextEdit(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily(_fromUtf8("FreeMono"))
|
||||
self.codeView.setFont(font)
|
||||
self.codeView.setObjectName(_fromUtf8("codeView"))
|
||||
self.verticalLayout_2.addWidget(self.codeView)
|
||||
self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
@ -78,5 +92,5 @@ class Ui_Form(object):
|
||||
self.forceGraphicsCombo.setItemText(0, QtGui.QApplication.translate("Form", "native", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.forceGraphicsCombo.setItemText(1, QtGui.QApplication.translate("Form", "raster", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.forceGraphicsCombo.setItemText(2, QtGui.QApplication.translate("Form", "opengl", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.loadBtn.setText(QtGui.QApplication.translate("Form", "Load Example", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.loadBtn.setText(QtGui.QApplication.translate("Form", "Run Example", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file './examples/exampleLoaderTemplate.ui'
|
||||
# Form implementation generated from reading ui file './exampleLoaderTemplate.ui'
|
||||
#
|
||||
# Created: Mon Dec 24 00:33:39 2012
|
||||
# by: pyside-uic 0.2.13 running on PySide 1.1.2
|
||||
# Created: Mon Feb 25 09:02:09 2013
|
||||
# by: pyside-uic 0.2.13 running on PySide 1.1.1
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
@ -12,7 +12,7 @@ from PySide import QtCore, QtGui
|
||||
class Ui_Form(object):
|
||||
def setupUi(self, Form):
|
||||
Form.setObjectName("Form")
|
||||
Form.resize(762, 302)
|
||||
Form.resize(623, 380)
|
||||
self.gridLayout = QtGui.QGridLayout(Form)
|
||||
self.gridLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.gridLayout.setSpacing(0)
|
||||
@ -20,46 +20,60 @@ class Ui_Form(object):
|
||||
self.splitter = QtGui.QSplitter(Form)
|
||||
self.splitter.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.splitter.setObjectName("splitter")
|
||||
self.layoutWidget = QtGui.QWidget(self.splitter)
|
||||
self.layoutWidget.setObjectName("layoutWidget")
|
||||
self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget)
|
||||
self.widget = QtGui.QWidget(self.splitter)
|
||||
self.widget.setObjectName("widget")
|
||||
self.verticalLayout = QtGui.QVBoxLayout(self.widget)
|
||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.exampleTree = QtGui.QTreeWidget(self.layoutWidget)
|
||||
self.exampleTree = QtGui.QTreeWidget(self.widget)
|
||||
self.exampleTree.setObjectName("exampleTree")
|
||||
self.exampleTree.headerItem().setText(0, "1")
|
||||
self.exampleTree.header().setVisible(False)
|
||||
self.verticalLayout.addWidget(self.exampleTree)
|
||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.pyqtCheck = QtGui.QCheckBox(self.layoutWidget)
|
||||
self.pyqtCheck = QtGui.QCheckBox(self.widget)
|
||||
self.pyqtCheck.setObjectName("pyqtCheck")
|
||||
self.horizontalLayout.addWidget(self.pyqtCheck)
|
||||
self.pysideCheck = QtGui.QCheckBox(self.layoutWidget)
|
||||
self.pysideCheck = QtGui.QCheckBox(self.widget)
|
||||
self.pysideCheck.setObjectName("pysideCheck")
|
||||
self.horizontalLayout.addWidget(self.pysideCheck)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
self.horizontalLayout_2 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.forceGraphicsCheck = QtGui.QCheckBox(self.layoutWidget)
|
||||
self.forceGraphicsCheck = QtGui.QCheckBox(self.widget)
|
||||
self.forceGraphicsCheck.setObjectName("forceGraphicsCheck")
|
||||
self.horizontalLayout_2.addWidget(self.forceGraphicsCheck)
|
||||
self.forceGraphicsCombo = QtGui.QComboBox(self.layoutWidget)
|
||||
self.forceGraphicsCombo = QtGui.QComboBox(self.widget)
|
||||
self.forceGraphicsCombo.setObjectName("forceGraphicsCombo")
|
||||
self.forceGraphicsCombo.addItem("")
|
||||
self.forceGraphicsCombo.addItem("")
|
||||
self.forceGraphicsCombo.addItem("")
|
||||
self.horizontalLayout_2.addWidget(self.forceGraphicsCombo)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout_2)
|
||||
self.loadBtn = QtGui.QPushButton(self.layoutWidget)
|
||||
self.loadBtn = QtGui.QPushButton(self.widget)
|
||||
self.loadBtn.setObjectName("loadBtn")
|
||||
self.verticalLayout.addWidget(self.loadBtn)
|
||||
self.codeView = QtGui.QTextBrowser(self.splitter)
|
||||
self.widget1 = QtGui.QWidget(self.splitter)
|
||||
self.widget1.setObjectName("widget1")
|
||||
self.verticalLayout_2 = QtGui.QVBoxLayout(self.widget1)
|
||||
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
|
||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
||||
self.loadedFileLabel = QtGui.QLabel(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily("Monospace")
|
||||
font.setPointSize(10)
|
||||
font.setWeight(75)
|
||||
font.setBold(True)
|
||||
self.loadedFileLabel.setFont(font)
|
||||
self.loadedFileLabel.setText("")
|
||||
self.loadedFileLabel.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.loadedFileLabel.setObjectName("loadedFileLabel")
|
||||
self.verticalLayout_2.addWidget(self.loadedFileLabel)
|
||||
self.codeView = QtGui.QPlainTextEdit(self.widget1)
|
||||
font = QtGui.QFont()
|
||||
font.setFamily("FreeMono")
|
||||
self.codeView.setFont(font)
|
||||
self.codeView.setObjectName("codeView")
|
||||
self.verticalLayout_2.addWidget(self.codeView)
|
||||
self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
|
||||
|
||||
self.retranslateUi(Form)
|
||||
@ -73,5 +87,5 @@ class Ui_Form(object):
|
||||
self.forceGraphicsCombo.setItemText(0, QtGui.QApplication.translate("Form", "native", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.forceGraphicsCombo.setItemText(1, QtGui.QApplication.translate("Form", "raster", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.forceGraphicsCombo.setItemText(2, QtGui.QApplication.translate("Form", "opengl", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.loadBtn.setText(QtGui.QApplication.translate("Form", "Load Example", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.loadBtn.setText(QtGui.QApplication.translate("Form", "Run Example", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
|
@ -12,13 +12,14 @@ import numpy as np
|
||||
|
||||
win = pg.GraphicsWindow()
|
||||
win.resize(800,350)
|
||||
win.setWindowTitle('pyqtgraph example: Histogram')
|
||||
plt1 = win.addPlot()
|
||||
plt2 = win.addPlot()
|
||||
|
||||
## make interesting distribution of values
|
||||
vals = np.hstack([np.random.normal(size=500), np.random.normal(size=260, loc=4)])
|
||||
|
||||
## draw standard histogram
|
||||
## compute standard histogram
|
||||
y,x = np.histogram(vals, bins=np.linspace(-3, 8, 40))
|
||||
|
||||
## notice that len(x) == len(y)+1
|
||||
|
@ -4,7 +4,10 @@
|
||||
import sys, os
|
||||
|
||||
if not hasattr(sys, 'frozen'):
|
||||
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
||||
if __file__ == '<stdin>':
|
||||
path = os.getcwd()
|
||||
else:
|
||||
path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
||||
path.rstrip(os.path.sep)
|
||||
if 'pyqtgraph' in os.listdir(path):
|
||||
sys.path.insert(0, path) ## examples adjacent to pyqtgraph (as in source tree)
|
||||
|
@ -22,6 +22,7 @@ data = ndi.gaussian_filter(data, (10, 10, 10))[frames/2:frames + frames/2]
|
||||
data[:, 15:16, 15:17] += 1
|
||||
|
||||
win = pg.GraphicsWindow()
|
||||
win.setWindowTitle('pyqtgraph example: Isocurve')
|
||||
vb = win.addViewBox()
|
||||
img = pg.ImageItem(data[0])
|
||||
vb.addItem(img)
|
||||
|
@ -1,8 +1,9 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
## This example demonstrates the ability to link the axes of views together
|
||||
## Views can be linked manually using the context menu, but only if they are given names.
|
||||
|
||||
"""
|
||||
This example demonstrates the ability to link the axes of views together
|
||||
Views can be linked manually using the context menu, but only if they are given
|
||||
names.
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
@ -19,7 +20,7 @@ app = QtGui.QApplication([])
|
||||
x = np.linspace(-50, 50, 1000)
|
||||
y = np.sin(x) / x
|
||||
|
||||
win = pg.GraphicsWindow(title="View Linking Examples")
|
||||
win = pg.GraphicsWindow(title="pyqtgraph example: Linked Views")
|
||||
win.resize(800,600)
|
||||
|
||||
win.addLabel("Linked Views", colspan=2)
|
||||
|
@ -1,5 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Test programmatically setting log transformation modes.
|
||||
"""
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
import numpy as np
|
||||
@ -10,6 +12,7 @@ import pyqtgraph as pg
|
||||
app = QtGui.QApplication([])
|
||||
|
||||
w = pg.GraphicsWindow()
|
||||
w.setWindowTitle('pyqtgraph example: logAxis')
|
||||
p1 = w.addPlot(0,0, title="X Semilog")
|
||||
p2 = w.addPlot(1,0, title="Y Semilog")
|
||||
p3 = w.addPlot(2,0, title="XY Log")
|
||||
|
@ -39,7 +39,7 @@ def plot():
|
||||
#plt.addItem(item)
|
||||
|
||||
dt = pg.ptime.time() - start
|
||||
print "Create plots took: %0.3fms" % (dt*1000)
|
||||
print("Create plots took: %0.3fms" % (dt*1000))
|
||||
|
||||
## Plot and clear 5 times, printing the time it took
|
||||
for i in range(5):
|
||||
@ -72,7 +72,7 @@ def fastPlot():
|
||||
plt.addItem(item)
|
||||
|
||||
dt = pg.ptime.time() - start
|
||||
print "Create plots took: %0.3fms" % (dt*1000)
|
||||
print("Create plots took: %0.3fms" % (dt*1000))
|
||||
|
||||
|
||||
## Plot and clear 5 times, printing the time it took
|
||||
@ -82,7 +82,7 @@ if hasattr(pg, 'arrayToQPath'):
|
||||
fastPlot()
|
||||
app.processEvents()
|
||||
else:
|
||||
print "Skipping fast tests--arrayToQPath function is missing."
|
||||
print("Skipping fast tests--arrayToQPath function is missing.")
|
||||
|
||||
plt.autoRange()
|
||||
|
||||
|
@ -140,6 +140,7 @@ p.param('Save/Restore functionality', 'Restore State').sigActivated.connect(rest
|
||||
t = ParameterTree()
|
||||
t.setParameters(p, showTop=False)
|
||||
t.show()
|
||||
t.setWindowTitle('pyqtgraph example: Parameter Tree')
|
||||
t.resize(400,800)
|
||||
t2 = ParameterTree()
|
||||
t2.setParameters(p, showTop=False)
|
||||
|
@ -1,10 +1,18 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
|
||||
Description of example
|
||||
|
||||
|
||||
"""
|
||||
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
|
||||
|
||||
# win.setWindowTitle('pyqtgraph example: ____')
|
||||
|
||||
## Start Qt event loop unless running in interactive mode or using pyside.
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
|
@ -1,6 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
## This example shows how to insert text into a scene using QTextItem
|
||||
"""
|
||||
This example shows how to insert text into a scene using TextItem. This class
|
||||
is for displaying text that is anchored to a particular location in the data
|
||||
coordinate system, but which is always displayed unscaled.
|
||||
|
||||
For text that scales with the data, use QTextItem.
|
||||
For text that can be placed in a layout, use LabelItem.
|
||||
"""
|
||||
|
||||
import initExample ## Add path to library (just for examples; you do not need this)
|
||||
|
||||
@ -13,6 +19,7 @@ x = np.linspace(-20, 20, 1000)
|
||||
y = np.sin(x) / x
|
||||
plot = pg.plot() ## create an empty plot widget
|
||||
plot.setYRange(-1, 2)
|
||||
plot.setWindowTitle('pyqtgraph example: text')
|
||||
curve = plot.plot(x,y) ## add a single curve
|
||||
|
||||
## Create text object, use HTML tags to specify color/size
|
||||
|
@ -34,8 +34,12 @@ class ExportDialog(QtGui.QWidget):
|
||||
|
||||
def show(self, item=None):
|
||||
if item is not None:
|
||||
## Select next exportable parent of the item originally clicked on
|
||||
while not isinstance(item, pg.ViewBox) and not isinstance(item, pg.PlotItem) and item is not None:
|
||||
item = item.parentItem()
|
||||
## if this is a ViewBox inside a PlotItem, select the parent instead.
|
||||
if isinstance(item, pg.ViewBox) and isinstance(item.parentItem(), pg.PlotItem):
|
||||
item = item.parentItem()
|
||||
self.updateItemList(select=item)
|
||||
self.setVisible(True)
|
||||
self.activateWindow()
|
||||
|
@ -22,7 +22,7 @@ class PlotData(object):
|
||||
self.maxVals = {} ## cache for max/min
|
||||
self.minVals = {}
|
||||
|
||||
def addFields(self, fields):
|
||||
def addFields(self, **fields):
|
||||
for f in fields:
|
||||
if f not in self.fields:
|
||||
self.fields[f] = None
|
||||
|
@ -10,7 +10,7 @@ as it can be converted to/from a string using repr and eval.
|
||||
"""
|
||||
|
||||
import re, os, sys
|
||||
from pgcollections import OrderedDict
|
||||
from .pgcollections import OrderedDict
|
||||
GLOBAL_PATH = None # so not thread safe.
|
||||
from . import units
|
||||
from .python2_3 import asUnicode
|
||||
@ -199,4 +199,4 @@ key2: ##comment
|
||||
print("============")
|
||||
data = readConfigFile(fn)
|
||||
print(data)
|
||||
os.remove(fn)
|
||||
os.remove(fn)
|
||||
|
@ -212,6 +212,19 @@ class Dock(QtGui.QWidget, DockDrop):
|
||||
def __repr__(self):
|
||||
return "<Dock %s %s>" % (self.name(), self.stretch())
|
||||
|
||||
## PySide bug: We need to explicitly redefine these methods
|
||||
## or else drag/drop events will not be delivered.
|
||||
def dragEnterEvent(self, *args):
|
||||
DockDrop.dragEnterEvent(self, *args)
|
||||
|
||||
def dragMoveEvent(self, *args):
|
||||
DockDrop.dragMoveEvent(self, *args)
|
||||
|
||||
def dragLeaveEvent(self, *args):
|
||||
DockDrop.dragLeaveEvent(self, *args)
|
||||
|
||||
def dropEvent(self, *args):
|
||||
DockDrop.dropEvent(self, *args)
|
||||
|
||||
class DockLabel(VerticalLabel):
|
||||
|
||||
|
@ -33,12 +33,13 @@ class DockArea(Container, QtGui.QWidget, DockDrop):
|
||||
def type(self):
|
||||
return "top"
|
||||
|
||||
def addDock(self, dock, position='bottom', relativeTo=None):
|
||||
def addDock(self, dock=None, position='bottom', relativeTo=None, **kwds):
|
||||
"""Adds a dock to this area.
|
||||
|
||||
=========== =================================================================
|
||||
Arguments:
|
||||
dock The new Dock object to add.
|
||||
dock The new Dock object to add. If None, then a new Dock will be
|
||||
created.
|
||||
position 'bottom', 'top', 'left', 'right', 'over', or 'under'
|
||||
relativeTo If relativeTo is None, then the new Dock is added to fill an
|
||||
entire edge of the window. If relativeTo is another Dock, then
|
||||
@ -46,7 +47,12 @@ class DockArea(Container, QtGui.QWidget, DockDrop):
|
||||
configuration for 'over' and 'under').
|
||||
=========== =================================================================
|
||||
|
||||
All extra keyword arguments are passed to Dock.__init__() if *dock* is
|
||||
None.
|
||||
"""
|
||||
if dock is None:
|
||||
dock = Dock(**kwds)
|
||||
|
||||
|
||||
## Determine the container to insert this dock into.
|
||||
## If there is no neighbor, then the container is the top.
|
||||
@ -100,6 +106,8 @@ class DockArea(Container, QtGui.QWidget, DockDrop):
|
||||
dock.area = self
|
||||
self.docks[dock.name()] = dock
|
||||
|
||||
return dock
|
||||
|
||||
def moveDock(self, dock, position, neighbor):
|
||||
"""
|
||||
Move an existing Dock to a new location.
|
||||
@ -293,5 +301,19 @@ class DockArea(Container, QtGui.QWidget, DockDrop):
|
||||
self.home.removeTempArea(self)
|
||||
#self.close()
|
||||
|
||||
## PySide bug: We need to explicitly redefine these methods
|
||||
## or else drag/drop events will not be delivered.
|
||||
def dragEnterEvent(self, *args):
|
||||
DockDrop.dragEnterEvent(self, *args)
|
||||
|
||||
def dragMoveEvent(self, *args):
|
||||
DockDrop.dragMoveEvent(self, *args)
|
||||
|
||||
def dragLeaveEvent(self, *args):
|
||||
DockDrop.dragLeaveEvent(self, *args)
|
||||
|
||||
def dropEvent(self, *args):
|
||||
DockDrop.dropEvent(self, *args)
|
||||
|
||||
|
||||
|
@ -14,6 +14,7 @@ class CSVExporter(Exporter):
|
||||
Exporter.__init__(self, item)
|
||||
self.params = Parameter(name='params', type='group', children=[
|
||||
{'name': 'separator', 'type': 'list', 'value': 'comma', 'values': ['comma', 'tab']},
|
||||
{'name': 'precision', 'type': 'int', 'value': 10, 'limits': [0, None]},
|
||||
])
|
||||
|
||||
def parameters(self):
|
||||
@ -42,18 +43,15 @@ class CSVExporter(Exporter):
|
||||
|
||||
fd.write(sep.join(header) + '\n')
|
||||
i = 0
|
||||
while True:
|
||||
done = True
|
||||
numFormat = '%%0.%dg' % self.params['precision']
|
||||
numRows = reduce(max, [len(d[0]) for d in data])
|
||||
for i in range(numRows):
|
||||
for d in data:
|
||||
if i < len(d[0]):
|
||||
fd.write('%g%s%g%s'%(d[0][i], sep, d[1][i], sep))
|
||||
done = False
|
||||
fd.write(numFormat % d[0][i] + sep + numFormat % d[1][i] + sep)
|
||||
else:
|
||||
fd.write(' %s %s' % (sep, sep))
|
||||
fd.write('\n')
|
||||
if done:
|
||||
break
|
||||
i += 1
|
||||
fd.close()
|
||||
|
||||
|
||||
|
@ -206,17 +206,12 @@ class Flowchart(Node):
|
||||
item = node.graphicsItem()
|
||||
item.setZValue(self.nextZVal*2)
|
||||
self.nextZVal += 1
|
||||
#item.setParentItem(self.chartGraphicsItem())
|
||||
self.viewBox.addItem(item)
|
||||
#item.setPos(pos2.x(), pos2.y())
|
||||
item.moveBy(*pos)
|
||||
self._nodes[name] = node
|
||||
self.widget().addNode(node)
|
||||
#QtCore.QObject.connect(node, QtCore.SIGNAL('closed'), self.nodeClosed)
|
||||
node.sigClosed.connect(self.nodeClosed)
|
||||
#QtCore.QObject.connect(node, QtCore.SIGNAL('renamed'), self.nodeRenamed)
|
||||
node.sigRenamed.connect(self.nodeRenamed)
|
||||
#QtCore.QObject.connect(node, QtCore.SIGNAL('outputChanged'), self.nodeOutputChanged)
|
||||
node.sigOutputChanged.connect(self.nodeOutputChanged)
|
||||
|
||||
def removeNode(self, node):
|
||||
@ -225,17 +220,14 @@ class Flowchart(Node):
|
||||
def nodeClosed(self, node):
|
||||
del self._nodes[node.name()]
|
||||
self.widget().removeNode(node)
|
||||
#QtCore.QObject.disconnect(node, QtCore.SIGNAL('closed'), self.nodeClosed)
|
||||
try:
|
||||
node.sigClosed.disconnect(self.nodeClosed)
|
||||
except TypeError:
|
||||
pass
|
||||
#QtCore.QObject.disconnect(node, QtCore.SIGNAL('renamed'), self.nodeRenamed)
|
||||
try:
|
||||
node.sigRenamed.disconnect(self.nodeRenamed)
|
||||
except TypeError:
|
||||
pass
|
||||
#QtCore.QObject.disconnect(node, QtCore.SIGNAL('outputChanged'), self.nodeOutputChanged)
|
||||
try:
|
||||
node.sigOutputChanged.disconnect(self.nodeOutputChanged)
|
||||
except TypeError:
|
||||
|
@ -90,7 +90,7 @@
|
||||
<customwidget>
|
||||
<class>FlowchartGraphicsView</class>
|
||||
<extends>QGraphicsView</extends>
|
||||
<header>FlowchartGraphicsView</header>
|
||||
<header>pyqtgraph.flowchart.FlowchartGraphicsView</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
|
@ -2,8 +2,8 @@
|
||||
|
||||
# Form implementation generated from reading ui file './flowchart/FlowchartTemplate.ui'
|
||||
#
|
||||
# Created: Sun Sep 9 14:41:29 2012
|
||||
# by: PyQt4 UI code generator 4.9.1
|
||||
# Created: Sun Feb 24 19:47:29 2013
|
||||
# by: PyQt4 UI code generator 4.9.3
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
@ -56,4 +56,4 @@ class Ui_Form(object):
|
||||
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
from pyqtgraph.widgets.DataTreeWidget import DataTreeWidget
|
||||
from FlowchartGraphicsView import FlowchartGraphicsView
|
||||
from pyqtgraph.flowchart.FlowchartGraphicsView import FlowchartGraphicsView
|
||||
|
@ -2,8 +2,8 @@
|
||||
|
||||
# Form implementation generated from reading ui file './flowchart/FlowchartTemplate.ui'
|
||||
#
|
||||
# Created: Sun Sep 9 14:41:30 2012
|
||||
# by: pyside-uic 0.2.13 running on PySide 1.1.0
|
||||
# Created: Sun Feb 24 19:47:30 2013
|
||||
# by: pyside-uic 0.2.13 running on PySide 1.1.1
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
@ -51,4 +51,4 @@ class Ui_Form(object):
|
||||
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
from pyqtgraph.widgets.DataTreeWidget import DataTreeWidget
|
||||
from FlowchartGraphicsView import FlowchartGraphicsView
|
||||
from pyqtgraph.flowchart.FlowchartGraphicsView import FlowchartGraphicsView
|
||||
|
@ -152,7 +152,7 @@ class RegionSelectNode(CtrlNode):
|
||||
#print " new rgn:", c, region
|
||||
#self.items[c].setYRange([0., 0.2], relative=True)
|
||||
|
||||
if self.selected.isConnected():
|
||||
if self['selected'].isConnected():
|
||||
if data is None:
|
||||
sliced = None
|
||||
elif (hasattr(data, 'implements') and data.implements('MetaArray')):
|
||||
@ -219,7 +219,6 @@ class EvalNode(Node):
|
||||
text = str(self.text.toPlainText())
|
||||
if text != self.lastText:
|
||||
self.lastText = text
|
||||
print("eval node update")
|
||||
self.update()
|
||||
return QtGui.QTextEdit.focusOutEvent(self.text, ev)
|
||||
|
||||
|
@ -21,7 +21,7 @@ class PlotWidgetNode(Node):
|
||||
self.items = {}
|
||||
|
||||
def disconnected(self, localTerm, remoteTerm):
|
||||
if localTerm is self.In and remoteTerm in self.items:
|
||||
if localTerm is self['In'] and remoteTerm in self.items:
|
||||
self.plot.removeItem(self.items[remoteTerm])
|
||||
del self.items[remoteTerm]
|
||||
|
||||
|
@ -84,8 +84,41 @@ class ArrowItem(QtGui.QGraphicsPathItem):
|
||||
def paint(self, p, *args):
|
||||
p.setRenderHint(QtGui.QPainter.Antialiasing)
|
||||
QtGui.QGraphicsPathItem.paint(self, p, *args)
|
||||
|
||||
#p.setPen(fn.mkPen('r'))
|
||||
#p.setBrush(fn.mkBrush(None))
|
||||
#p.drawRect(self.boundingRect())
|
||||
|
||||
def shape(self):
|
||||
#if not self.opts['pxMode']:
|
||||
#return QtGui.QGraphicsPathItem.shape(self)
|
||||
return self.path
|
||||
return self.path
|
||||
|
||||
## dataBounds and pixelPadding methods are provided to ensure ViewBox can
|
||||
## properly auto-range
|
||||
def dataBounds(self, ax, frac, orthoRange=None):
|
||||
pw = 0
|
||||
pen = self.pen()
|
||||
if not pen.isCosmetic():
|
||||
pw = pen.width() * 0.7072
|
||||
if self.opts['pxMode']:
|
||||
return [0,0]
|
||||
else:
|
||||
br = self.boundingRect()
|
||||
if ax == 0:
|
||||
return [br.left()-pw, br.right()+pw]
|
||||
else:
|
||||
return [br.top()-pw, br.bottom()+pw]
|
||||
|
||||
def pixelPadding(self):
|
||||
pad = 0
|
||||
if self.opts['pxMode']:
|
||||
br = self.boundingRect()
|
||||
pad += (br.width()**2 + br.height()**2) ** 0.5
|
||||
pen = self.pen()
|
||||
if pen.isCosmetic():
|
||||
pad += max(1, pen.width()) * 0.7072
|
||||
return pad
|
||||
|
||||
|
||||
|
@ -782,7 +782,8 @@ class GradientEditorItem(TickSliderItem):
|
||||
self.sigGradientChangeFinished.emit(self)
|
||||
|
||||
|
||||
class Tick(GraphicsObject):
|
||||
class Tick(QtGui.QGraphicsObject): ## NOTE: Making this a subclass of GraphicsObject instead results in
|
||||
## activating this bug: https://bugreports.qt-project.org/browse/PYSIDE-86
|
||||
## private class
|
||||
|
||||
sigMoving = QtCore.Signal(object)
|
||||
@ -802,7 +803,7 @@ class Tick(GraphicsObject):
|
||||
self.pg.lineTo(QtCore.QPointF(scale/3**0.5, scale))
|
||||
self.pg.closeSubpath()
|
||||
|
||||
GraphicsObject.__init__(self)
|
||||
QtGui.QGraphicsObject.__init__(self)
|
||||
self.setPos(pos[0], pos[1])
|
||||
if self.movable:
|
||||
self.setZValue(1)
|
||||
|
@ -495,8 +495,8 @@ class ScatterPlotItem(GraphicsObject):
|
||||
|
||||
if isinstance(size, np.ndarray) or isinstance(size, list):
|
||||
sizes = size
|
||||
if kargs['mask'] is not None:
|
||||
sizes = sizes[kargs['mask']]
|
||||
if mask is not None:
|
||||
sizes = sizes[mask]
|
||||
if len(sizes) != len(dataSet):
|
||||
raise Exception("Number of sizes does not match number of points (%d != %d)" % (len(sizes), len(dataSet)))
|
||||
dataSet['size'] = sizes
|
||||
@ -508,13 +508,13 @@ class ScatterPlotItem(GraphicsObject):
|
||||
if update:
|
||||
self.updateSpots(dataSet)
|
||||
|
||||
def setPointData(self, data, dataSet=None):
|
||||
def setPointData(self, data, dataSet=None, mask=None):
|
||||
if dataSet is None:
|
||||
dataSet = self.data
|
||||
|
||||
if isinstance(data, np.ndarray) or isinstance(data, list):
|
||||
if kargs['mask'] is not None:
|
||||
data = data[kargs['mask']]
|
||||
if mask is not None:
|
||||
data = data[mask]
|
||||
if len(data) != len(dataSet):
|
||||
raise Exception("Length of meta data does not match number of points (%d != %d)" % (len(data), len(dataSet)))
|
||||
|
||||
|
@ -336,7 +336,7 @@ class ViewBox(GraphicsWidget):
|
||||
print("make qrectf failed:", self.state['targetRange'])
|
||||
raise
|
||||
|
||||
def setRange(self, rect=None, xRange=None, yRange=None, padding=0.02, update=True, disableAutoRange=True):
|
||||
def setRange(self, rect=None, xRange=None, yRange=None, padding=None, update=True, disableAutoRange=True):
|
||||
"""
|
||||
Set the visible range of the ViewBox.
|
||||
Must specify at least one of *range*, *xRange*, or *yRange*.
|
||||
@ -347,7 +347,8 @@ class ViewBox(GraphicsWidget):
|
||||
*xRange* (min,max) The range that should be visible along the x-axis.
|
||||
*yRange* (min,max) The range that should be visible along the y-axis.
|
||||
*padding* (float) Expand the view by a fraction of the requested range.
|
||||
By default, this value is 0.02 (2%)
|
||||
By default, this value is set between 0.02 and 0.1 depending on
|
||||
the size of the ViewBox.
|
||||
============= =====================================================================
|
||||
|
||||
"""
|
||||
@ -367,6 +368,10 @@ class ViewBox(GraphicsWidget):
|
||||
|
||||
changed = [False, False]
|
||||
for ax, range in changes.items():
|
||||
if padding is None:
|
||||
xpad = self.suggestPadding(ax)
|
||||
else:
|
||||
xpad = padding
|
||||
mn = min(range)
|
||||
mx = max(range)
|
||||
if mn == mx: ## If we requested 0 range, try to preserve previous scale. Otherwise just pick an arbitrary scale.
|
||||
@ -375,11 +380,11 @@ class ViewBox(GraphicsWidget):
|
||||
dy = 1
|
||||
mn -= dy*0.5
|
||||
mx += dy*0.5
|
||||
padding = 0.0
|
||||
xpad = 0.0
|
||||
if any(np.isnan([mn, mx])) or any(np.isinf([mn, mx])):
|
||||
raise Exception("Not setting range [%s, %s]" % (str(mn), str(mx)))
|
||||
|
||||
p = (mx-mn) * padding
|
||||
p = (mx-mn) * xpad
|
||||
mn -= p
|
||||
mx += p
|
||||
|
||||
@ -412,34 +417,53 @@ class ViewBox(GraphicsWidget):
|
||||
elif changed[1] and self.state['autoVisibleOnly'][0]:
|
||||
self.updateAutoRange()
|
||||
|
||||
def setYRange(self, min, max, padding=0.02, update=True):
|
||||
def setYRange(self, min, max, padding=None, update=True):
|
||||
"""
|
||||
Set the visible Y range of the view to [*min*, *max*].
|
||||
The *padding* argument causes the range to be set larger by the fraction specified.
|
||||
(by default, this value is between 0.02 and 0.1 depending on the size of the ViewBox)
|
||||
"""
|
||||
self.setRange(yRange=[min, max], update=update, padding=padding)
|
||||
|
||||
def setXRange(self, min, max, padding=0.02, update=True):
|
||||
def setXRange(self, min, max, padding=None, update=True):
|
||||
"""
|
||||
Set the visible X range of the view to [*min*, *max*].
|
||||
The *padding* argument causes the range to be set larger by the fraction specified.
|
||||
(by default, this value is between 0.02 and 0.1 depending on the size of the ViewBox)
|
||||
"""
|
||||
self.setRange(xRange=[min, max], update=update, padding=padding)
|
||||
|
||||
def autoRange(self, padding=0.02, item=None):
|
||||
def autoRange(self, padding=None, items=None, item=None):
|
||||
"""
|
||||
Set the range of the view box to make all children visible.
|
||||
Note that this is not the same as enableAutoRange, which causes the view to
|
||||
automatically auto-range whenever its contents are changed.
|
||||
|
||||
=========== ============================================================
|
||||
Arguments
|
||||
padding The fraction of the total data range to add on to the final
|
||||
visible range. By default, this value is set between 0.02
|
||||
and 0.1 depending on the size of the ViewBox.
|
||||
items If specified, this is a list of items to consider when
|
||||
determining the visible range.
|
||||
=========== ============================================================
|
||||
"""
|
||||
if item is None:
|
||||
bounds = self.childrenBoundingRect()
|
||||
bounds = self.childrenBoundingRect(items=items)
|
||||
else:
|
||||
print("Warning: ViewBox.autoRange(item=__) is deprecated. Use 'items' argument instead.")
|
||||
bounds = self.mapFromItemToView(item, item.boundingRect()).boundingRect()
|
||||
|
||||
if bounds is not None:
|
||||
self.setRange(bounds, padding=padding)
|
||||
|
||||
def suggestPadding(self, axis):
|
||||
l = self.width() if axis==0 else self.height()
|
||||
if l > 0:
|
||||
padding = np.clip(1./(l**0.5), 0.02, 0.1)
|
||||
else:
|
||||
padding = 0.02
|
||||
return padding
|
||||
|
||||
def scaleBy(self, s, center=None):
|
||||
"""
|
||||
@ -577,12 +601,10 @@ class ViewBox(GraphicsWidget):
|
||||
w2 = (targetRect[ax][1]-targetRect[ax][0]) / 2.
|
||||
childRange[ax] = [x-w2, x+w2]
|
||||
else:
|
||||
l = self.width() if ax==0 else self.height()
|
||||
if l > 0:
|
||||
padding = np.clip(1./(l**0.5), 0.02, 0.1)
|
||||
wp = (xr[1] - xr[0]) * padding
|
||||
childRange[ax][0] -= wp
|
||||
childRange[ax][1] += wp
|
||||
padding = self.suggestPadding(ax)
|
||||
wp = (xr[1] - xr[0]) * padding
|
||||
childRange[ax][0] -= wp
|
||||
childRange[ax][1] += wp
|
||||
targetRect[ax] = childRange[ax]
|
||||
args['xRange' if ax == 0 else 'yRange'] = targetRect[ax]
|
||||
if len(args) == 0:
|
||||
@ -995,13 +1017,14 @@ class ViewBox(GraphicsWidget):
|
||||
|
||||
|
||||
|
||||
def childrenBounds(self, frac=None, orthoRange=(None,None)):
|
||||
def childrenBounds(self, frac=None, orthoRange=(None,None), items=None):
|
||||
"""Return the bounding range of all children.
|
||||
[[xmin, xmax], [ymin, ymax]]
|
||||
Values may be None if there are no specific bounds for an axis.
|
||||
"""
|
||||
prof = debug.Profiler('updateAutoRange', disabled=True)
|
||||
items = self.addedItems
|
||||
if items is None:
|
||||
items = self.addedItems
|
||||
|
||||
## measure pixel dimensions in view box
|
||||
px, py = [v.length() if v is not None else 0 for v in self.childGroup.pixelVectors()]
|
||||
|
@ -205,7 +205,12 @@ class ImageView(QtGui.QWidget):
|
||||
*axes* Dictionary indicating the interpretation for each axis.
|
||||
This is only needed to override the default guess. Format is::
|
||||
|
||||
{'t':0, 'x':1, 'y':2, 'c':3};
|
||||
{'t':0, 'x':1, 'y':2, 'c':3};
|
||||
|
||||
*pos* Change the position of the displayed image
|
||||
*scale* Change the scale of the displayed image
|
||||
*transform* Set the transform of the dispalyed image. This option overrides *pos*
|
||||
and *scale*.
|
||||
============== =======================================================================
|
||||
"""
|
||||
prof = debug.Profiler('ImageView.setImage', disabled=True)
|
||||
|
@ -436,7 +436,7 @@ class MeshData(object):
|
||||
elif self._faceColorsIndexedByFaces is not None:
|
||||
names.append('_faceColorsIndexedByFaces')
|
||||
|
||||
state = {n:getattr(self, n) for n in names}
|
||||
state = dict([(n,getattr(self, n)) for n in names])
|
||||
return pickle.dumps(state)
|
||||
|
||||
def restore(self, state):
|
||||
|
Loading…
x
Reference in New Issue
Block a user