title: Kivy : How to use on_key_down and on_key_up keyboard event in Tree View?
body: <p>I am using <code>python-2.7</code> and <code>kivy-1.10.0</code>.<br/>
  When i click on <code>name</code> TextInput then Tree View shows. 
  I want the label to be selected with the <code>up</code> and <code>down</code> keys, and when the <code>enter</code> key is pressed the text is copied the selected text is copied to the initial form as it is currently done when you click on the item</p>
  
  <h1>test.py</h1>
  
  <pre><code>from kivy.uix.screenmanager import Screen
  from kivy.app import App
  from kivy.lang import Builder
  from kivy.core.window import Window
  from kivy.uix.popup import Popup
  from kivy.uix.treeview import TreeView, TreeViewLabel, TreeViewNode
  from kivy.uix.label import Label
  from kivy.properties import ObjectProperty
  Window.size = (500, 200)
  
  
  def populate_tree_view(tree_view, parent, node):
      if parent is None:
          tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
                                                       is_open=True))
      else:
          tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
                                                       is_open=True), parent)
  
      for child_node in node['children']:
          populate_tree_view(tree_view, tree_node, child_node)
  
  
  tree = []
  rows = [(1, 'test1', 11), (2, 'test2', 2), (3, 'test3', 3)]
  for r in rows:
      tree.append({'node_id': r[1], 'children': []})
  
  
  
  class TreeViewLabel(Label, TreeViewNode):
      pass
  
  
  class TreeviewGroup(Popup):
      treeview = ObjectProperty(None)
      tv = ObjectProperty(None)
      #ti = ObjectProperty()
  
      def __init__(self, **kwargs):
          super(TreeviewGroup, self).__init__(**kwargs)
          self.tv = TreeView(root_options=dict(text=""),
                         hide_root=False,
                         indent_level=4)
          for branch in tree:
              populate_tree_view(self.tv, None, branch)
          self.remove_widgets()
          self.treeview.add_widget(self.tv)
  
      def remove_widgets(self):
          for child in [child for child in self.treeview.children]:
              self.treeview.remove_widget(child)
  
      def select_node(self, node):
          '''Select a node in the tree.
                  '''
          if node.no_selection:
              return
          if self._selected_node:
              self._selected_node.is_selected = False
          node.is_selected = True
          self._selected_node = node
          print(node)
  
  class GroupScreen(Screen):
      name = ObjectProperty(None)
      popup = ObjectProperty(None)
  
      def display_groups(self, instance):
          if len(instance.text) &gt; 0:
              if self.popup is None:
                  self.popup = TreeviewGroup()
              #self.popup.filter(instance.text)
              self.popup.open()
  
  
      def select_node(self, node):
          '''Select a node in the tree.
                  '''
          if node.no_selection:
              return
          if self._selected_node:
              self._selected_node.is_selected = False
          node.is_selected = True
          self._selected_node = node
          print(node)
  
  
  class Group(App):
      def build(self):
          self.root = Builder.load_file('test.kv')
          return self.root
  
  
  if __name__ == '__main__':
      Group().run()
  </code></pre>
  
  <h1>test.kv</h1>
  
  <pre><code>#:kivy 1.10.0
  
  &lt;TreeViewLabel&gt;:
      on_touch_down:
          app.root.name.text = self.text
          app.root.popup.dismiss()
  
  &lt;TreeviewGroup&gt;:
      id: treeview
      treeview: treeview
      title: "Select"
      size_hint: None, None
      size: 400, 200
      auto_dismiss: False
  
      BoxLayout
          orientation: "vertical"
          #TextInput:
              #id: ti
              #size_hint_y: .1
              #on_text: root.filter(self.text)
          BoxLayout:
              id: treeview
          Button:
              size_hint: 1, 0.1
              text: "Close"
              on_release: root.dismiss()
  
  
  &lt;CustomLabel@Label&gt;:
      text_size: self.size
      valign: "middle"
      padding_x: 5
  
  &lt;SingleLineTextInput@TextInput&gt;:
      multiline: False
  
  &lt;GreenButton@Button&gt;:
      background_color: 1, 1, 1, 1
      size_hint_y: None
      height: self.parent.height * 0.150
  
  GroupScreen:
      name: name
      test:test
  
      GridLayout:
          cols: 2
          padding : 30,30
          spacing: 10, 10
          row_default_height: '40dp'
  
          CustomLabel:
              text: 'Code'
  
          SingleLineTextInput:
              id: test
              multiline: False
              on_text_validate: name.focus = True
  
  
          CustomLabel:
              text: 'Name'
  
          SingleLineTextInput:
              id: name
              text:' '
              multiline: False
              on_focus: root.display_groups(self)
  
  
  
          GreenButton:
              text: 'Ok'
  
          GreenButton:
              text: 'Cancel'
              on_press: app.stop()
  </code></pre>