Kivy: obtenha IDs de widgets e acesse widgets por propriedade exclusiva

Eu sou novo no Kivy e tenho este pequeno trecho de demonstração que demonstra meu 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()

Então, quando você executar o código, haverá dois botões:

primeiro percorrer todos os widgets e imprimir seus nomes (o que funciona como esperado - retorna 'nome' para cada widget),segundo botão para percorrer todos os widgets também, mas, em vez de nomes, imprime seus IDs (o que não funciona - retorna Nenhum para cada ID).

Minhas perguntas são:

'Id' não é uma propriedade como 'name'?Como posso acessar a identificação de cada widget do lado do python?

Pergunta bônus:

Posso acessar um widget "globalmente" por seu ID (assumindo que todos os ID são exclusivos)? Por "globalmente", quero dizer, por exemplo, acessar (no código acima) os IDs do widget 'MyBox:' sem referenciar pai-filho, mas apenas pelos IDs (ou talvez qualquer outra propriedade que seria exclusiva para cada widget). Eu estava pensando em criar um dicionário {id: widget object} de todos os widgets para facilitar o acesso, a menos que haja outra maneira que eu não conheça? Para enfatizar - estou tentando evitar a referência pelos pais dos filhos (o que é bastante confuso quando você deseja alterar sua árvore de widgets mais tarde) e gostaria de gerar widgets na linguagem .kv. Então, qual seria a melhor maneira de fazer isso?

EDITAR:

Então, aqui está a maneira mais fácil de pensar em fazer referência a widgets por um ID "global" exclusivo.

Primeiro, criei uma classe que será herdada pela minha classe App:

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

Portanto, o widget será registrado apenas se tiver gid - uma variável de classe de widget - e for único. Dessa forma, posso armazenar apenas widgets vitais neste ditado. Além disso, é facilmente acessível do lado .kv e python.

Agora, crio as variáveis gid e as registro no dict em .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)

O que mais me incomoda é o fato de eu registrar meus widgets neste dicionário "global" com o evento 'on_pos' ... do qual realmente não gosto, mas não consegui encontrar nenhuma maneira confiável de chamar um método de registro após o o widget foi inicializado (on_pos é chamado logo após a fase init, quando o widget é posicionado e posteriormente muito raramente, então ... parecia a maneira menos preocupante de fazer isso com o meu conhecimento do kivy api, os widgets de ordem são inicializados com .kv linguagem etc; portanto, se houver uma maneira melhor, eu ficaria muito contente por qualquer ponteiro).

De qualquer forma, desta maneira eu posso facilmente vincular qualquer evento a qualquer método em qualquer classe diretamente do .kv

Uma coisa a lembrar é que o GID (IDs globais) precisa ser único globalmente, mas não acho isso mais perturbador do que manter os IDs exclusivos localmente (o que pode ser igualmente ou até mais confuso para mim). E como eu disse - gostaria de registrar os widgets de maneira diferente, mas não consegui encontrar outra maneira confiável de fazer isso (e não acho o Clock confiável para essas coisas).

questionAnswers(3)

yourAnswerToTheQuestion