kivy: как использовать StringProperty и bind()?

У меня есть 2 экрана, которыми управляет менеджер экрана.

Я использую глобальную переменную, CHOSEN_ITEM, чтобы сохранить строковую переменную, которая изменяется на первом экране.

это CHOSEN_ITEM отображается на втором экране. Я знаю, что нужно использовать StringProperty, но я не могу найти хороший пример, понятный мне для этого...

from kivy.properties import ObjectProperty, StringProperty
    ...
CHOSEN_ITEM = ''

class FirstScreen(Screen):
      ...
    def save_chosen(self):
        global CHOSEN_ITEM
        CHOSEN_ITEM = chosen_item
      ...

class SecondScreen(Screen):
      ...
    global CHOSEN_ITEM
    chosen_item = StringProperty(CHOSEN_ITEM)

    def on_modif_chosenitem(self):
        print('Chosen Item was modified')
    self.bind(chosen_item=self.on_modif_chosenitem)
    ...

Ошибка тогда:

     File "_event.pyx", line 255, in kivy._event.EventDispatcher.bind (/tmp/pip-build-udl9oi/kivy/kivy/_event.c:3738)
 KeyError: 'chosen_item'

Я не понимаю, как использовать bind с StringProperty,

1 ответ

Решение

Хорошо, я нашел решение, вдохновленное @inclement, в: Kivy ObjectProperty для обновления текста метки

from kivy.event import EventDispatcher
from kivy.properties import StringProperty
    ...
CHOSEN_ITEM = ''

class Chosen_Item(EventDispatcher):
    chosen = StringProperty('')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.chosen = 'Default String'
        self.bind(chosen=self.on_modified)

    def set_chosen_item(self, chosen_string):
        self.chosen = chosen_string

    def get_chosen_item(self):
        return self.chosen

    def on_modified(self, instance, value):
        print("Chosen item in ", instance, " was modified to :",value)  

class FirstScreen(Screen):
    global CHOSEN_ITEM
    CHOSEN_ITEM = Chosen_Item()
      ...
    def save_chosen(self):
      CHOSEN_ITEM.set_chosen_item(chosen_item) 
      ...

class SecondScreen(Screen):
      ...
    global CHOSEN_ITEM
    chosen_item = CHOSEN_ITEM.get_chosen_item()
    ...

Это было нелегко... для меня

Другие вопросы по тегам