#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. Большое вам спасибо! В какой-то момент у меня была аналогичная попытка, но я не смог заставить ее работать. Ваше решение работает как шарм. Есть чему поучиться. 🙂 Еще раз спасибо!