Kivy 1.10.1 обновляет тег ScreenManager с помощью функции - PullRequest
0 голосов
/ 30 сентября 2018

Я считаю, что моя проблема в том, что тег label_text в разделе ScreenManager: не обновляется при запуске функции change_text (). Потому что он просто показывает исходное значение label_text, которое в данном случаеничего нет.

Кто-нибудь знает, как заставить тег обновляться?Моя цель - передать строки между двумя классами экрана.Поэтому, когда пользователь вводит что-то вроде почтового индекса на предыдущем экране, я могу передать его на новый экран.

#:kivy 1.1.3

ScreenManager:
    id: screen_manager

    SearchScreen:
        id: search_screen
        name: 'SearchScreen'
        manager: screen_manager
    ForecastScreen:
        id: forecast_screen
        name: 'ForecastScreen'
        manager: screen_manager
        label_text: search_screen.text

<SearchScreen>:
    display: entry
    FloatLayout:
        TextInput:
            id: entry
            on_text_validate:
                root.change_text()

<ForecastScreen>:
    BoxLayout:
        FloatLayout:
            Label:
                text:root.label_text

Затем код 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()


Builder.load_file('weather.kv')
sm = ScreenManager()
sm.add_widget(SearchScreen(name='SearchScreen'))
sm.add_widget(ForecastScreen(name='ForecastScreen'))

class WeatherApp(App):
    def build(self):
        return sm

if __name__ == "__main__":
    WeatherApp().run()

1 Ответ

0 голосов
/ 30 сентября 2018

Во-первых, 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
...