def __init__(self, pid, objects): self.inspector = ObjectInspector(pid) self.objects = objects self.summary = objects.summarize()
class PyrasiteMemoryViewer(object): palette = [ ('body', 'black', 'light gray', 'standout'), ('header', 'white', 'dark red', 'bold'), ('button normal', 'light gray', 'dark blue', 'standout'), ('button select', 'white', 'dark green'), ('button disabled', 'dark gray', 'dark blue'), ('bigtext', 'white', 'black'), ('object_output', 'light gray', 'black'), ('exit', 'white', 'dark red'), ] def __init__(self, pid, objects): self.inspector = ObjectInspector(pid) self.objects = objects self.summary = objects.summarize() def create_radio_button(self, g, name, obj, fn, disabled=False): w = urwid.RadioButton(g, name, False, on_state_change=fn) w.obj = obj if disabled: w = urwid.AttrWrap(w, 'button normal', 'button disabled') else: w = urwid.AttrWrap(w, 'button normal', 'button select') return w def create_disabled_radio_button(self, name): w = urwid.Text(' ' + name) w = urwid.AttrWrap(w, 'button disabled') return w def display_object(self, w, state): if state: value = self.inspector.inspect(w.obj.max_address) self.object_output.set_text(value) def get_object_buttons(self, group=[]): buttons = [] for i, line in enumerate(str(self.summary).split('\n')): if i in (0, 1): rb = self.create_disabled_radio_button(line) else: obj = self.summary.summaries[i - 2] rb = self.create_radio_button(group, line, obj, self.display_object) buttons.append(rb) return buttons def setup_view(self): self.object_buttons = self.get_object_buttons() # Title self.bigtext = urwid.BigText('pyrasite ' + __version__, None) self.bigtext.set_font(urwid.Thin6x6Font()) bt = urwid.Padding(self.bigtext, 'left', None) bt = urwid.AttrWrap(bt, 'bigtext') # Create the object outpu self.object_output = urwid.Text("", wrap='any') ca = urwid.AttrWrap(self.object_output, 'object_output') # Select the first object self.object_buttons[2].set_state(True) # ListBox obj_out = urwid.Pile([urwid.Divider(), ca]) objects = urwid.Pile(self.object_buttons) l = [objects, obj_out] w = urwid.ListBox(urwid.SimpleListWalker(l)) # Frame w = urwid.AttrWrap(w, 'body') w = urwid.Frame(header=bt, body=w) # Exit message exit = urwid.BigText(('exit', " Quit? "), urwid.Thin6x6Font()) exit = urwid.Overlay(exit, w, 'center', None, 'middle', None) return w, exit def unhandled_input(self, key): if key in ('f8', 'q'): self.loop.widget = self.exit_view return True if self.loop.widget != self.exit_view: return if key in ('y', 'Y'): raise urwid.ExitMainLoop() if key in ('n', 'N'): self.loop.widget = self.view return True def main(self): self.view, self.exit_view = self.setup_view() self.loop = urwid.MainLoop(self.view, self.palette, unhandled_input=self.unhandled_input) self.loop.run()