rendered paste bodyimport urwidimport urwid.raw_displayclass BundleTableRow(urwid.Columns): def __init__(self, controller): self.controller = controller self.name = urwid.Text("XXX" + str(id(controller))) urwid.Columns.__init__(self, [ ('weight', 0.6, self.name), ]) class BundleListWalker(urwid.ListWalker): def __init__(self, model): self.model = model self.bundles = list() self.focus = 0 def set_focus(self, focus): if not self.bundles: return None, None if focus < 0 or focus >= len(self.bundles): focus = len(self.bundles) - 1 self.focus = focus return self.bundles[focus], focus def get_focus(self): if not self.bundles: return None, None return self.bundles[self.focus], self.focus def get_next(self, pos): pos = pos + 1 if pos >= len(self.bundles): return None, None return self.bundles[pos], pos def get_prev(self, pos): pos = pos - 1 if pos < 0: return None, None return self.bundles[pos], pos def reloadTable(self): """ Reload the table. """ del self.bundles[:] for bundle in ['a', 'b', 'c']: self.bundles.append( urwid.AttrWrap( BundleTableRow(bundle), 'unfocused', 'focused' ) )class X(urwid.Frame): def __init__(self): self.bundleTable = BundleListWalker(self) self.listbox = urwid.ListBox(self.bundleTable) self.detail = urwid.ListBox([]) self.pile = urwid.Pile([ self.listbox, ('flow', urwid.AttrWrap(urwid.Divider('-'), 'header')), self.detail, ('flow', urwid.AttrWrap(urwid.Divider('-'), 'header')), ]) urwid.Frame.__init__(self, urwid.AttrWrap(self.pile, 'body')) palette = [ ('body', 'light gray','black', 'standout'), ('reverse', 'light gray','black'), ('header', 'white','dark red', 'bold'), ('important','dark blue','light gray', ('standout','underline')), ('unfocused', 'light gray', 'black'), ('focused', 'light gray', 'dark blue'), ('editfc','white', 'dark blue', 'bold'), ('editbx','light gray', 'dark blue'), ('editcp','black','light gray', 'standout'), ('bright','dark gray','light gray', ('bold','standout')), ('buttn','black','dark cyan'), ('buttnf','white','dark blue','bold'), ]ui = urwid.raw_display.Screen()ui.register_palette(palette)def run(): size = ui.get_cols_rows() view = X() view.bundleTable.reloadTable() while True: canvas = view.render(size, focus=1) ui.draw_screen( size, canvas ) keys = None while not keys: keys = ui.get_input() for k in keys: if k == 'window resize': size = self.ui.get_cols_rows() else: view.keypress(size, k)ui.run_wrapper(run)