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
75
76
77
78
79
80
81
82
83
84
85
86
|
import hal
import glib
import time
from inspect import stack
class OtherClass:
'''
methods in this class are not exposed as callback handlers
since the object instance is not passed to gladevcp in get_handlers()
'''
def invisible(selfself):
pass
class HandlerClass:
'''
class with gladevcp callback handlers
'''
def on_button_press(self,widget,data=None):
'''
a callback method
parameters are:
the generating object instance, likte a GtkButton instance
user data passed if any - this is currently unused but
the convention should be retained just in case
'''
self.nhits += 1
laptime = time.time() - self.start
self.builder.get_object('message').set_label("time lap#%d: %.2f seconds" % (self.nhits,laptime))
def _on_timer_tick(self,userdata=None):
'''
the full glib functionality is available if needed.
here's a timer function which will be called periodically
returning True restarts the timer
returning False makes it a one-shot
'''
self.ticks += 1
self.halcomp['value'] = self.ticks
return True
def __init__(self, halcomp,builder,useropts):
'''
Handler classes are instantiated in the following state:
- the widget tree is created, but not yet realized (no toplevel window.show() executed yet)
- the halcomp HAL component is set up and the widhget tree's HAL pins have already been added to it
- it is safe to add more hal pins because halcomp.ready() has not yet been called at this point.
after all handlers are instantiated in command line and get_handlers() order, callbacks will be
connected with connect_signals()/signal_autoconnect()
The builder may be either of libglade or GtkBuilder type depending on the glade file format.
'''
self.halcomp = halcomp
self.builder = builder
self.halcomp.newpin("value", hal.HAL_FLOAT, hal.HAL_OUT)
self.start = time.time()
self.nhits = 0
self.ticks = 0
# demonstrate a slow background timer - granularity is one second
# for a faster timer, use this:
# glib.timeout_add(5000, self._on_timer_tick)
glib.timeout_add_seconds(1, self._on_timer_tick)
other = OtherClass() # executed at import time
def get_handlers(halcomp,builder,useropts):
'''
this function is called by gladevcp at import time (when this module is passed with '-u <modname>.py')
return a list of object instances whose methods should be connected as callback handlers
any method whose name does not begin with an underscore ('_') is a callback candidate
the 'get_handlers' name is reserved - gladevcp expects it, so do not change
'''
return [HandlerClass(halcomp,builder,useropts)]
|