Не удается обновить метку kivy через переменную

#python #kivy #label #kivy-language

#python #kivy #метка #kivy-язык

Вопрос:

Я пытаюсь заставить приложение работать, где я получаю список папок в каталоге, отображаемый в kivy recycleview. Затем я хочу выбрать одну из папок, и ее имя отображается в ярлыке. Я новичок в kivy и довольно новичок в python, и после более чем двух дней чтения сообщений несколько раз снова и снова мне просто не удается отобразить выбранную папку в ярлыке. У меня получилось, если я вызвал функцию через кнопку в kv, но не через класс SelectableButton.

Мой файл .py:

 from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.properties import ListProperty, StringProperty, ObjectProperty, BooleanProperty
from kivy.uix.recycleview import RecycleView
from kivy.uix.recycleview.views import RecycleDataViewBehavior
from kivy.uix.recycleboxlayout import RecycleBoxLayout
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
from kivy.uix.behaviors import FocusBehavior
from kivy.uix.boxlayout import BoxLayout


prjct_list_clean = ['Folder1', 'Folder2', 'Folder3', 'Folder4', 'Folder5', 'Folder6']

class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout):
    """ Adds selection and focus behaviour to the view. """
    selected_value = StringProperty('')
    btn_info = ListProperty(prjct_list_clean)

class SelectableButton(RecycleDataViewBehavior, Button, Widget):
    """ Add selection support to the Label """
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

#############################ProblemPart###################################

    def on_press(self):
        con_wksp = str(self.text)
        self.ids.con_wksp_label = con_wksp
        print(self.ids.con_wksp_label) #Value gets printet

###########################################################################

class RV(RecycleView):
    rv_layout = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = []
        for subject in prjct_list_clean:
            self.data.append({'text':subject})
        print(prjct_list_clean)

class SelectedWksp(Widget):
    pass

class TroubleshootApp(BoxLayout, App,):
    def build(self):
        self.add_widget(RV())
        self.add_widget(SelectedWksp())
        return self

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

Мой файл .kv:

 #:kivy 2.0.0

<RV>:
    rv_layout: rv_layout
    bar_width: 0
    viewclass: 'SelectableButton'
    SelectableRecycleBoxLayout:
        id: rv_layout
        default_size: None, dp(56)
        default_size_hint: 0.9, None
        size_hint_y: None
        height: self.minimum_height
        orientation: "vertical"

<SelectedWksp>:
    BoxLayout:
        Label:
            id: con_wksp_label
            text: 'Default'
 

Я уверен, что это, вероятно, какая-то простая ошибка новичка, но я просто не могу разобраться в этом.

Спасибо всем за время.

Ответ №1:

Вы можете изменить свой on_press() метод на:

 def on_press(self):
    App.get_running_app().set_label(self.text)
 

и измените свой класс приложения на:

 class TroubleshootApp(BoxLayout, App,):
    def build(self):
        self.add_widget(RV())
        self.wksp = SelectedWksp()   # save a reference to the SelecetedWksp instance
        self.add_widget(self.wksp)
        return self

    def set_label(self, txt):   # set the text of the label
        self.wksp.ids.con_wksp_label.text = txt
 

Комментарии:

1. Большое вам спасибо! В какой-то момент у меня была аналогичная попытка, но я не смог заставить ее работать. Ваше решение работает как шарм. Есть чему поучиться. 🙂 Еще раз спасибо!