__main__.py 7.61 KB
Newer Older
1
import sys, os, subprocess, time
2 3
## make sure this pyqtgraph is importable before any others
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
4
from pyqtgraph.Qt import QtCore, QtGui, USE_PYSIDE
5

6 7 8 9 10
if USE_PYSIDE:
    from exampleLoaderTemplate_pyside import Ui_Form
else:
    from exampleLoaderTemplate_pyqt import Ui_Form
    
11
import os, sys
12
from pyqtgraph.pgcollections import OrderedDict
13 14 15 16

examples = OrderedDict([
    ('Command-line usage', 'CLIexample.py'),
    ('Basic Plotting', 'Plotting.py'),
Luke Campagnola's avatar
Luke Campagnola committed
17
    ('ImageView', 'ImageView.py'),
18
    ('ParameterTree', 'parametertree.py'),
19
    ('Crosshair / Mouse interaction', 'crosshair.py'),
Luke Campagnola's avatar
Luke Campagnola committed
20
    ('Data Slicing', 'DataSlicing.py'),
21
    ('Plot Customization', 'customPlot.py'),
Luke Campagnola's avatar
Luke Campagnola committed
22
    ('Dock widgets', 'dockarea.py'),
23
    ('Console', 'ConsoleWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
24
    ('Histograms', 'histogram.py'),
25
    ('GraphicsItems', OrderedDict([
Luke Campagnola's avatar
Luke Campagnola committed
26
        ('Scatter Plot', 'ScatterPlot.py'),
Luke Campagnola's avatar
Luke Campagnola committed
27
        #('PlotItem', 'PlotItem.py'),
28
        ('IsocurveItem', 'isocurve.py'),
29 30
        ('ImageItem - video', 'ImageItem.py'),
        ('ImageItem - draw', 'Draw.py'),
Luke Campagnola's avatar
Luke Campagnola committed
31
        ('Region-of-Interest', 'ROIExamples.py'),
32
        ('GraphicsLayout', 'GraphicsLayout.py'),
33
        ('LegendItem', 'Legend.py'),
Luke Campagnola's avatar
Luke Campagnola committed
34
        ('Text Item', 'text.py'),
35
        ('Linked Views', 'linkedViews.py'),
36
        ('Arrow', 'Arrow.py'),
Luke Campagnola's avatar
Luke Campagnola committed
37 38
        ('ViewBox', 'ViewBox.py'),
    ])),
Luke Campagnola's avatar
Luke Campagnola committed
39 40 41 42 43
    ('Benchmarks', OrderedDict([
        ('Video speed test', 'VideoSpeedTest.py'),
        ('Line Plot update', 'PlotSpeedTest.py'),
        ('Scatter Plot update', 'ScatterPlotSpeedTest.py'),
    ])),
Luke Campagnola's avatar
Luke Campagnola committed
44 45
    ('3D Graphics', OrderedDict([
        ('Volumetric', 'GLVolumeItem.py'),
46 47
        ('Isosurface', 'GLIsosurface.py'),
        ('Surface Plot', 'GLSurfacePlot.py'),
48
        ('Scatter Plot', 'GLScatterPlotItem.py'),
49 50 51
        ('Shaders', 'GLshaders.py'),
        ('Mesh', 'GLMeshItem.py'),
        ('Image', 'GLImageItem.py'),
52 53 54
    ])),
    ('Widgets', OrderedDict([
        ('PlotWidget', 'PlotWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
55
        ('SpinBox', 'SpinBox.py'),
56
        ('ConsoleWidget', 'ConsoleWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
57 58
        ('TreeWidget', 'TreeWidget.py'),
        ('DataTreeWidget', 'DataTreeWidget.py'),
59
        ('GradientWidget', 'GradientWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
60
        #('TableWidget', '../widgets/TableWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
61
        ('ColorButton', 'ColorButton.py'),
Luke Campagnola's avatar
Luke Campagnola committed
62 63
        #('CheckTable', '../widgets/CheckTable.py'),
        #('VerticalLabel', '../widgets/VerticalLabel.py'),
64
        ('JoystickButton', 'JoystickButton.py'),
65
    ])),
66
    
67 68
    ('GraphicsScene', 'GraphicsScene.py'),
    ('Flowcharts', 'Flowchart.py'),
Luke Campagnola's avatar
Luke Campagnola committed
69 70
    #('Canvas', '../canvas'),
    #('MultiPlotWidget', 'MultiPlotWidget.py'),
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
])

path = os.path.abspath(os.path.dirname(__file__))

class ExampleLoader(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_Form()
        self.cw = QtGui.QWidget()
        self.setCentralWidget(self.cw)
        self.ui.setupUi(self.cw)
        
        global examples
        self.populateTree(self.ui.exampleTree.invisibleRootItem(), examples)
        self.ui.exampleTree.expandAll()
        
Luke Campagnola's avatar
Luke Campagnola committed
87
        self.resize(1000,500)
88
        self.show()
Luke Campagnola's avatar
Luke Campagnola committed
89
        self.ui.splitter.setSizes([250,750])
90 91 92
        self.ui.loadBtn.clicked.connect(self.loadFile)
        self.ui.exampleTree.currentItemChanged.connect(self.showFile)
        self.ui.exampleTree.itemDoubleClicked.connect(self.loadFile)
93 94
        self.ui.pyqtCheck.toggled.connect(self.pyqtToggled)
        self.ui.pysideCheck.toggled.connect(self.pysideToggled)
95

96 97 98 99 100 101 102 103
    def pyqtToggled(self, b):
        if b:
            self.ui.pysideCheck.setChecked(False)
        
    def pysideToggled(self, b):
        if b:
            self.ui.pyqtCheck.setChecked(False)
        
104 105

    def populateTree(self, root, examples):
106
        for key, val in examples.items():
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
            item = QtGui.QTreeWidgetItem([key])
            if isinstance(val, basestring):
                item.file = val
            else:
                self.populateTree(item, val)
            root.addChild(item)
            
    
    def currentFile(self):
        item = self.ui.exampleTree.currentItem()
        if hasattr(item, 'file'):
            global path
            return os.path.join(path, item.file)
        return None
    
    def loadFile(self):
        fn = self.currentFile()
124 125 126 127 128
        extra = []
        if self.ui.pyqtCheck.isChecked():
            extra.append('pyqt')
        elif self.ui.pysideCheck.isChecked():
            extra.append('pyside')
129 130 131
        
        if self.ui.forceGraphicsCheck.isChecked():
            extra.append(str(self.ui.forceGraphicsCombo.currentText()))
132

133 134
        if fn is None:
            return
135
        if sys.platform.startswith('win'):
136
            os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
137
        else:
138
            os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
139 140 141 142 143 144 145
        
            
    def showFile(self):
        fn = self.currentFile()
        if fn is None:
            self.ui.codeView.clear()
            return
Luke Campagnola's avatar
Luke Campagnola committed
146 147
        if os.path.isdir(fn):
            fn = os.path.join(fn, '__main__.py')
148 149 150 151 152 153 154
        text = open(fn).read()
        self.ui.codeView.setPlainText(text)

def run():
    app = QtGui.QApplication([])
    loader = ExampleLoader()
    
Luke Campagnola's avatar
Luke Campagnola committed
155
    app.exec_()
156

157 158 159 160 161 162 163 164 165 166 167 168
def buildFileList(examples, files=None):
    if files == None:
        files = []
    for key, val in examples.items():
        #item = QtGui.QTreeWidgetItem([key])
        if isinstance(val, basestring):
            #item.file = val
            files.append((key,val))
        else:
            buildFileList(val, files)
    return files
            
Luke Campagnola's avatar
Luke Campagnola committed
169
def testFile(name, f, exe, lib, graphicsSystem=None):
170 171 172
    global path
    fn =  os.path.join(path,f)
    #print "starting process: ", fn
173
    os.chdir(path)
174 175 176
    sys.stdout.write(name)
    sys.stdout.flush()
    
177 178 179
    import1 = "import %s" % lib if lib != '' else ''
    import2 = os.path.splitext(os.path.split(fn)[1])[0]
    graphicsSystem = '' if graphicsSystem is None else "pg.QtGui.QApplication.setGraphicsSystem('%s')" % graphicsSystem
180 181
    code = """
try:
182 183
    %s
    import pyqtgraph as pg
184 185
    %s
    import %s
Luke Campagnola's avatar
Luke Campagnola committed
186
    import sys
187
    print("test complete")
Luke Campagnola's avatar
Luke Campagnola committed
188 189
    sys.stdout.flush()
    import time
190 191 192 193 194 195 196
    while True:  ## run a little event loop
        pg.QtGui.QApplication.processEvents()
        time.sleep(0.01)
except:
    print("test failed")
    raise

Luke Campagnola's avatar
Luke Campagnola committed
197 198
"""  % (import1, graphicsSystem, import2)

Luke Campagnola's avatar
Luke Campagnola committed
199
    process = subprocess.Popen(['exec %s -i' % (exe)], shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
200 201 202 203 204 205 206 207 208 209 210 211 212 213
    process.stdin.write(code.encode('UTF-8'))
    #process.stdin.close()
    output = ''
    fail = False
    while True:
        c = process.stdout.read(1).decode()
        output += c
        #sys.stdout.write(c)
        #sys.stdout.flush()
        if output.endswith('test complete'):
            break
        if output.endswith('test failed'):
            fail = True
            break
214
    time.sleep(1)
Luke Campagnola's avatar
Luke Campagnola committed
215 216
    process.kill()
    #process.wait()
217
    res = process.communicate()
Luke Campagnola's avatar
Luke Campagnola committed
218 219
    
    if fail or 'exception' in res[1].decode().lower() or 'error' in res[1].decode().lower():
220 221 222
        print('.' * (50-len(name)) + 'FAILED')
        print(res[0].decode())
        print(res[1].decode())
223
    else:
224
        print('.' * (50-len(name)) + 'passed')
225 226 227
    


228
if __name__ == '__main__':
229 230
    if '--test' in sys.argv[1:]:
        files = buildFileList(examples)
231 232 233 234 235 236 237 238 239
        if '--pyside' in sys.argv[1:]:
            lib = 'PySide'
        elif '--pyqt' in sys.argv[1:]:
            lib = 'PyQt4'
        else:
            lib = ''
            
        exe = sys.executable
        print("Running tests:", lib, sys.executable)
240
        for f in files:
241
            testFile(f[0], f[1], exe, lib)
242 243
    else: 
        run()