class ExampleTreeWidget(urwid.TreeWidget):
""" Display widget for leaf nodes """
def get_display_text(self):
return self.get_node().get_value()['name']
def selectable():
return True
class ExampleNode(urwid.TreeNode):
""" Data storage object for leaf nodes """
def load_widget(self):
return ExampleTreeWidget(self)
class ExampleParentNode(urwid.ParentNode):
""" Data storage object for interior/parent nodes """
def load_widget(self):
return ExampleTreeWidget(self)
def load_child_keys(self):
data = self.get_value()
return range(len(data['children']))
def load_child_node(self, key):
"""Return either an ExampleNode or ExampleParentNode"""
childdata = self.get_value()['children'][key]
childdepth = self.get_depth() + 1
if 'children' in childdata:
childclass = ExampleParentNode
else:
childclass = ExampleNode
return childclass(childdata, parent=self, key=key, depth=childdepth)
class ExampleTreeBrowser:
palette = [
('body', 'black', 'light gray'),
('focus', 'light gray', 'dark blue', 'standout'),
('head', 'yellow', 'black', 'standout'),
('foot', 'light gray', 'black'),
('key', 'light cyan', 'black','underline'),
('title', 'white', 'black', 'bold'),
('flag', 'dark gray', 'light gray'),
('error', 'dark red', 'light gray'),
]
footer_text = [
('title', "Example Data Browser"), " ",
('key', "UP"), ",", ('key', "DOWN"), ",",
('key', "PAGE UP"), ",", ('key', "PAGE DOWN"),
" ",
('key', "+"), ",",
('key', "-"), " ",
('key', "LEFT"), " ",
('key', "HOME"), " ",
('key', "END"), " ",
('key', "Q"),
]
def __init__(self, data=None):
self.topnode = ExampleParentNode(data)
self.listbox = urwid.TreeListBox(urwid.TreeWalker(self.topnode))
self.listbox.offset_rows = 1
self.header = urwid.Text( "" )
self.footer = urwid.AttrWrap( urwid.Text( self.footer_text ),
'foot')
self.view = urwid.Frame(
urwid.AttrWrap( self.listbox, 'body' ),
header=urwid.AttrWrap(self.header, 'head' ),
footer=self.footer )
def main(self):
"""Run the program."""
self.loop = urwid.MainLoop(self.listbox, self.palette,
unhandled_input=self.unhandled_input)
self.loop.run()
def unhandled_input(self, k):
if k in ('q','Q'):
raise urwid.ExitMainLoop()
def get_example_tree():
""" generate a quick 100 leaf tree for demo purposes """
retval = {"name":"parent1","children":[]}
for i in range(10):
retval['children'].append({"name":"child " + str(i)})
retval['children'][i]['children']=[]
for j in range(10):
retval['children'][i]['children'].append({"name":"grandchild " +
str(i) + "." + str(j)})
return retval
def main():
sample = get_example_tree()
ExampleTreeBrowser(sample).main()
Это код, который я использовал для создания дерева в urwid.
как я могу получить родительский узел выбранного узла дерева?