Во-первых, on_text_validate будет вызываться только при нажатии клавиши ввода, если свойство TextInput имеет многострочное свойство False, поэтому установите его.
С другой стороны, я вижу, что вы не понимаете разницу между:
Foo:
и
<Foo>:
В первом случае вы создаете экземпляр Foo (и может быть только один элемент этого типа), а во втором вы реализуете компонент,Когда вы вызываете Builder.load_file()
и имеете этот первый элемент без "<" ">, этот экземпляр возвращается, то есть уже существует ScreenManager, но в вашем случае вы создали другой с кодом Python.Экран ScreenManager, созданный в .kv, уже имеет экран, на котором тексты уже связаны, а в изменениях - нет.И когда вы возвращаете ScreenManager, созданный в python без связанных элементов, вы наблюдаете правильное поведение, ничего не изменится.
Что вам нужно сделать, это удалить ScreenManager из .py и использовать .kv:
*. Py
class SearchScreen(Screen):
text = StringProperty('')
def change_text(self):
self.text = "show this text"
self.manager.current = "ForecastScreen"
class ForecastScreen(Screen):
label_text = StringProperty("")
sm = Builder.load_file('weather.kv')
class WeatherApp(App):
def build(self):
return sm
if __name__ == "__main__":
WeatherApp().run()
*. Кв
ScreenManager:
id: screen_manager
SearchScreen:
id: search_screen
name: 'SearchScreen'
ForecastScreen:
id: forecast_screen
name: 'ForecastScreen'
label_text: search_screen.text
<SearchScreen>:
display: entry
FloatLayout:
TextInput:
id: entry
multiline: False # <----
on_text_validate:
root.change_text()
<ForecastScreen>:
BoxLayout:
FloatLayout:
Label:
text: root.label_text