__main__.py 7.65 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
        ('Shaders', 'GLshaders.py'),
50
        ('Line Plot', 'GLLinePlotItem.py'),
51
52
        ('Mesh', 'GLMeshItem.py'),
        ('Image', 'GLImageItem.py'),
53
54
55
    ])),
    ('Widgets', OrderedDict([
        ('PlotWidget', 'PlotWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
56
        ('SpinBox', 'SpinBox.py'),
57
        ('ConsoleWidget', 'ConsoleWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
58
59
        ('TreeWidget', 'TreeWidget.py'),
        ('DataTreeWidget', 'DataTreeWidget.py'),
60
        ('GradientWidget', 'GradientWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
61
        #('TableWidget', '../widgets/TableWidget.py'),
Luke Campagnola's avatar
Luke Campagnola committed
62
        ('ColorButton', 'ColorButton.py'),
Luke Campagnola's avatar
Luke Campagnola committed
63
64
        #('CheckTable', '../widgets/CheckTable.py'),
        #('VerticalLabel', '../widgets/VerticalLabel.py'),
65
        ('JoystickButton', 'JoystickButton.py'),
66
    ])),
67
    
68
69
    ('GraphicsScene', 'GraphicsScene.py'),
    ('Flowcharts', 'Flowchart.py'),
Luke Campagnola's avatar
Luke Campagnola committed
70
71
    #('Canvas', '../canvas'),
    #('MultiPlotWidget', 'MultiPlotWidget.py'),
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
])

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
88
        self.resize(1000,500)
89
        self.show()
Luke Campagnola's avatar
Luke Campagnola committed
90
        self.ui.splitter.setSizes([250,750])
91
92
93
        self.ui.loadBtn.clicked.connect(self.loadFile)
        self.ui.exampleTree.currentItemChanged.connect(self.showFile)
        self.ui.exampleTree.itemDoubleClicked.connect(self.loadFile)
94
95
        self.ui.pyqtCheck.toggled.connect(self.pyqtToggled)
        self.ui.pysideCheck.toggled.connect(self.pysideToggled)
96

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

    def populateTree(self, root, examples):
107
        for key, val in examples.items():
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
            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()
125
126
127
128
129
        extra = []
        if self.ui.pyqtCheck.isChecked():
            extra.append('pyqt')
        elif self.ui.pysideCheck.isChecked():
            extra.append('pyside')
130
131
132
        
        if self.ui.forceGraphicsCheck.isChecked():
            extra.append(str(self.ui.forceGraphicsCombo.currentText()))
133

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

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

158
159
160
161
162
163
164
165
166
167
168
169
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
170
def testFile(name, f, exe, lib, graphicsSystem=None):
171
172
173
    global path
    fn =  os.path.join(path,f)
    #print "starting process: ", fn
174
    os.chdir(path)
175
176
177
    sys.stdout.write(name)
    sys.stdout.flush()
    
178
179
180
    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
181
182
    code = """
try:
183
184
    %s
    import pyqtgraph as pg
185
186
    %s
    import %s
Luke Campagnola's avatar
Luke Campagnola committed
187
    import sys
188
    print("test complete")
Luke Campagnola's avatar
Luke Campagnola committed
189
190
    sys.stdout.flush()
    import time
191
192
193
194
195
196
197
    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
198
199
"""  % (import1, graphicsSystem, import2)

Luke Campagnola's avatar
Luke Campagnola committed
200
    process = subprocess.Popen(['exec %s -i' % (exe)], shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
201
202
203
204
205
206
207
208
209
210
211
212
213
214
    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
215
    time.sleep(1)
Luke Campagnola's avatar
Luke Campagnola committed
216
217
    process.kill()
    #process.wait()
218
    res = process.communicate()
Luke Campagnola's avatar
Luke Campagnola committed
219
220
    
    if fail or 'exception' in res[1].decode().lower() or 'error' in res[1].decode().lower():
221
222
223
        print('.' * (50-len(name)) + 'FAILED')
        print(res[0].decode())
        print(res[1].decode())
224
    else:
225
        print('.' * (50-len(name)) + 'passed')
226
227
228
    


229
if __name__ == '__main__':
230
231
    if '--test' in sys.argv[1:]:
        files = buildFileList(examples)
232
233
234
235
236
237
238
239
240
        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)
241
        for f in files:
242
            testFile(f[0], f[1], exe, lib)
243
244
    else: 
        run()