Передача данных в ExpansionPanel Kivy между классами
Наверно я плохо ищу, но никак не могу сделать передачу данных между классами. Если в случае с MDScreens все более-менее понятно, то как это сделать с MDExpansionPanel нигде не могу найти информации. То,что есть, как правило устаревшая и на новой версии не работает. Буду благодарен, если кто сумеет помочь.
main.py
class MainScr(MDScreen):
pass
class Content(MDExpansionPanel): # Класс с содержимым панели
pass
class TrailingPressedIconButton(ButtonBehavior, RotateBehavior, MDListItemTrailingIcon):
pass
...
# Функция, выводящая и заполняющая данными ExpansionPanel
def openShedule(self, answer, data):
self.sm.current = 'ShedScr'
self.ids = self.root.get_screen('ShedScr').ids
self.ids.btn_data.text = data
self.ids.box.clear_widgets()
### Читаем файл xml с расписанием ###
try:
tree = etree.parse(f'{answer[0]}.xml')
root = tree.getroot()
for i, item in enumerate(root.iter("Data")):
if item.text == data:
if answer[1] == root.xpath("//Shedule/NameFirst/text()")[i]:
async def set_panel_list():
await asynckivy.sleep(0)
self.ids.box.add_widget(Content())
asynckivy.start(set_panel_list())
# Content().ids.time_shedule.text = root.xpath("//Shedule/Start/text()")[i]
except:
# ... #
В myapp.kv такой код:
<ShedScr>:
name: 'ShedScr'
id: shedule
FitImage:
#radius: "15dp", "15dp", 0, 0
source: "paper1.jpg"
MDScreen:
ScrollView:
MDBoxLayout:
adaptive_height: True
spacing: 20
orientation: 'vertical'
MDButton:
pos_hint: {'center_x': .5, 'center_y': .965}
on_release: app.show_date_picker()
MDButtonText:
id: btn_data
text: "Дата"
MDLabel:
id: shedule_text
theme_text_color: "Custom"
text: ''
pos_hint: {"center_x": 0.5, "center_y": 0.80}
halign: "center"
MDList:
id: box
<Content>
MDExpansionPanelHeader:
MDListItem:
theme_bg_color: "Custom"
md_bg_color: self.theme_cls.surfaceContainerLowColor
ripple_effect: False
MDListItemSupportingText:
id: time_shedule
name: 'time_shedule'
text: "Запись с --- по ---"
TrailingPressedIconButton:
id: chevron
icon: "chevron-down"
on_release: app.tap_expansion_chevron(root, chevron)
MDExpansionPanelContent:
orientation: "vertical"
padding: 0, 0, 0, 0
md_bg_color: self.theme_cls.surfaceContainerLowestColor
MDLabel:
text: ""
adaptive_height: True
MDListItem:
theme_bg_color: "Custom"
md_bg_color: 'white'
MDListItemLeadingIcon:
icon: "account"
MDListItemHeadlineText:
text: "ФИО"
MDListItemSupportingText:
text: "Комментарий"
MDListItem:
theme_bg_color: "Custom"
md_bg_color: 'white'
MDListItemLeadingIcon:
icon: "phone"
MDListItemHeadlineText:
text: "Телефон"
MDListItemSupportingText:
text: "+7(123)456-78-90"
Все работает и на экран выводится в нужном количестве, но никак не соображу как передать данные из xml в поля панели.
Пробовал определить Content как MDScreen, но тогда ExpansionPanel не работает. Если я выполню print(Content().ids), то идентификатор виден. А в обратную сторону ну никак... Kivy 2.3.0 KivyMD 2.0.1
Ответы (1 шт):
Я - самоучка, "в университетах не кончали", поэтому не пинайте сильно! :)) Решил проблему "от обратного" - не передавать данные, а наоборот брать их из кода. Возможно кому-то поможет. Вопрос удалять не буду. Изменение кода main.py
if answer[1] == root.xpath("//Shedule/NameFirst/text()")[i]:
# Создал переменную
self.timeRecord = f'Запись с {root.xpath("//Shedule/Start/text()")[i]} по {root.xpath("//Shedule/End/text()")[i]}'
# Убрал async. т.к. при выводе он вначале формирует пакет, а потом выводит на экран. Из-за этого все надписи получались одинаковыми
self.ids.box.add_widget(Content())
Немного переделал myapp.kv
<Content>
MDExpansionPanelHeader:
MDListItem:
theme_bg_color: "Custom"
md_bg_color: self.theme_cls.surfaceContainerLowColor
ripple_effect: False
MDListItemSupportingText:
id: time_shedule
# В текст вывожу значение переменной.
text: app.timeRecord
Казалось бы 2 дня изучения интернета и простое решение. :)))