-
Notifications
You must be signed in to change notification settings - Fork 0
/
gui.py
74 lines (56 loc) · 2.35 KB
/
gui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/python
import pygtk
import gtk
import gtk.gdk as gdk
import gtk.glade
from read_nsd import NsdReader
from random import random
class Plot:
def __init__(self):
self.glade_file = "gui.glade"
self.wTree = gtk.glade.XML(self.glade_file)
self.window = self.wTree.get_widget("mainWindow")
self.wTree.signal_autoconnect(self)
self.reader = NsdReader( )
self.data = []
for i in range(50):
self.data += self.reader.parse(self.reader.get_data( ).next( ))
self.colors = [(random( ), random( ), random( )) for i in range(10)]
def on_mainWindow_destroy(self, window):
gtk.main_quit( )
def update_data(self):
self.data.pop(0)
self.data += self.reader.parse(self.reader.get_data( ).next( ))
def on_plotArea_expose_event(self, widget, event):
cr = widget.window.cairo_create( )
width = event.area.width
height = event.area.height
number_of_channels = len(self.data[0]["samples"])
channel_data = [[] for channel in range(number_of_channels)]
for i in range(number_of_channels):
for row in self.data:
try:
channel_data[i].append(row["samples"][i])
except:
pass
maximum = float(max(map(lambda x: max(x), channel_data)))
minimum = float(min(map(lambda x: min(x), channel_data)))
self.wTree.get_widget("label1").set_text("maximum: %s" % maximum)
self.wTree.get_widget("label2").set_text("minimum: %s" % minimum)
cr.set_line_width(3)
for channel_index, channel in enumerate(channel_data):
scale = lambda x: 0.4*height*(float(x) - minimum)/abs(maximum - minimum) + 0.5 * height
scaled_data = map(scale, channel)
cr.set_source_rgb(self.colors[channel_index][0],
self.colors[channel_index][1], self.colors[channel_index][2])
for index, row in enumerate(scaled_data):
cr.arc(width*index*1.0/len(scaled_data), row, 5, 0, 2*3.14)
cr.line_to(width*index*1.0/len(scaled_data), row)
cr.stroke( )
self.update_data( )
widget.window.invalidate_rect(gdk.Rectangle(0, 0, width, height), True)
return False
def main( ):
Plot( )
gtk.main( )
if __name__ == "__main__": main( )