Kivy: Obtenga identificadores de widgets y acceda a widgets por propiedad única

Soy nuevo en Kivy y tengo este pequeño fragmento de demostración que demuestra mi problema:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder


class KivyGuiApp(App):
    def build(self):
        return root_widget


class MyBox(BoxLayout):
    def print_ids(self, *args):
        print("\nids:")
        for widget in self.walk():
            print("{} -> {}".format(widget, widget.id))
    def print_names(self, *args):
        print("\nnames:")
        for widget in self.walk():
            print("{} -> {}".format(widget, widget.name))



root_widget = Builder.load_string("""
MyBox:
    id: screen_manager
    name: 'screen_manager'

    SimpleLayout:
        id: simple_layout
        name: 'simple_layout'


<SimpleLayout@BoxLayout>:
    id: simple_layout_rule
    name: 'simple_layout_rule'
    Button:
        id: button_ids
        name: 'button_ids'
        text: 'print ids to console'
        on_release: app.root.print_ids()
    Button:
        id: button_names
        name: 'button_names'
        text: 'print names to console'
        on_release: app.root.print_names()
""")


if __name__ == '__main__':
    KivyGuiApp().run()

Entonces, cuando ejecute el código, habrá dos botones:

primero en caminar sobre todos los widgets e imprimir sus nombres (que funciona como se esperaba, devuelve 'nombre' para cada widget),segundo botón para caminar sobre todos los widgets también, pero en lugar de nombres imprime sus identificadores (que no funciona, devuelve Ninguno para cada ID).

Mis preguntas son:

¿No es 'id' una propiedad como 'name'?¿Cómo puedo acceder a la identificación de cada widget desde el lado de Python?

Pregunta extra:

¿Puedo acceder a un widget "globalmente" por su identificación (suponiendo que todas las identificaciones sean únicas)? Por "globalmente" me refiero, por ejemplo, a acceder a los identificadores (en el código anterior) desde el widget 'MyBox:' sin hacer referencia al elemento primario-secundario, sino solo mediante identificadores (o tal vez cualquier otra propiedad que sea exclusiva de cada widget). Estaba pensando en crear un diccionario {id: objeto de widget} de todos los widgets para facilitar el acceso, a menos que haya otra forma que desconozco. Para enfatizar: estoy tratando de evitar las referencias por medio de padres e hijos (lo cual es bastante desordenado cuando desea cambiar su árbol de widgets más adelante) y me gustaría generar widgets en lenguaje .kv. Entonces, ¿cuál sería la mejor manera de hacer eso?

EDITAR:

Así que esta es la forma más fácil en que se me ocurre hacer referencia a los widgets mediante una identificación "global" única.

Primero creé una clase que será heredada por mi clase de aplicación:

class KivyWidgetInterface():
    ''' interface for  global widget access '''
    global_widgets = {}
    def register_widget(self, widget_object):
        ''' registers widget only if it has unique gid '''
        if widget_object.gid not in self.global_widgets:
            self.global_widgets[widget_object.gid] = widget_object

    def get_widget(self, widget_gid):
        ''' returns widget if it is registered '''
        if widget_gid in self.global_widgets:
            return self.global_widgets[widget_gid]
        else:
            return None

Por lo tanto, el widget se registrará solo si tiene gid, una variable de clase de widget, y es único. De esta manera, solo puedo almacenar widgets vitales en este dict. Además, es fácilmente accesible desde ambos lados .kv y python.

Ahora creo las variables gid y las registro en el dict en .kv:

<PickDirectory>:
    gid: 'pick_directory'
    on_pos: app.register_widget(self)
    on_selection: app.get_widget('filelist').some_func()
<FileListView>:
    gid: 'filelist'
    on_pos: app.register_widget(self)   
    Button:
        name: 'not important'
    Button:
        gid: 'tab_browse_button1'
        on_pos: app.register_widget(self)

Lo que realmente me molesta es que registro mis widgets en este diccionario "global" con el evento 'on_pos' ... que realmente no me gusta, pero no pude encontrar ninguna forma confiable de llamar a un método de registro después del el widget se inicializó (on_pos se llama justo después de la fase de inicio, cuando el widget se posiciona y luego muy raramente, así que ... parecía la forma menos molesta de hacerlo con mi conocimiento de kivy api, los widgets de orden se inicializan con .kv idioma, etc; así que si hay una mejor manera estaría muy agradecido por cualquier puntero).

De todos modos, de esta manera puedo vincular fácilmente cualquier evento a cualquier método en cualquier clase directamente desde el .kv

Una cosa para recordar es que los gid (ID globales) deben ser únicos a nivel mundial, pero no me parece más inquietante que mantener los ID únicos localmente (lo que podría ser igual o incluso más confuso para mí). Y como dije: me gustaría registrar los widgets de manera diferente, pero no pude encontrar ninguna otra forma confiable de hacerlo (y no encuentro que Clock sea confiable para tales cosas).

Respuestas a la pregunta(3)

Su respuesta a la pregunta