Решение от Eyllanesc верное, но оно, конечно, не единственное, альтернативное, если вы хотите сохранить логику в приложении, поэтому используйте идентификаторы из корневого виджета.
Поскольку вашкорневым классом является UpdatingLabels, и вы хотите обновить виджеты внутри того, у которого есть идентификатор, вы можете получить к ним доступ через app.root, который всегда ссылается на виджет, который был возвращен методом сборки.
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty
from kivy.properties import StringProperty
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.clock import Clock
Builder.load_string("""
<MyLabel>
text: "{}: {}".format(self.title, self.value)
<UpdatingLabels>
GridLayout:
rows: 1
pos: 0, 0
size: root.size
MyLabel:
id: lb0
title: "value 0"
MyLabel:
id: lb1
title: "value 1"
MyLabel:
id: lb2
title: "value 2"
""")
class UpdatingLabels(Widget):
pass
class MyLabel(Label):
value = NumericProperty(0)
title = StringProperty('')
class MyApp(App):
def build(self):
Clock.schedule_interval(self.clock_def, 1)
return UpdatingLabels()
def clock_def(self, dt):
self.root.ids.lb0.value += 1
self.root.ids.lb1.value += 2
self.root.ids.lb2.value += 3
if __name__ == '__main__':
MyApp().run()