Kivy динамически получает доступ к сетке в scrollview в python

#python #kivy #scrollview

#python #kivy #scrollview

Вопрос:

Я пытаюсь добавить метки / кнопки в GridLayout в Scrollview, но почему-то я не могу получить доступ к GridLayout в python. Рассмотрим следующий раздел .kv

 <DrvList>
    ScrollView:
        size_hint: (None, None)
        size: 0.95, 0.95
        GridLayout:
            minimum_height: self.height
            id: grid
            size_hint_y: None
            rows: 3
            cols: 1
  

и упрощенный соответствующий раздел Python

 class DrvList(ScrollView):
    selection = StringProperty()

    def __init__(self, *args, **kwargs):
        super(DrvList, self).__init__(*args, **kwargs)
        self._src = ["C", "D", "E"]
        for x in self._src:
            self.grid.add_widget(ToggleButton(id=x, text=x))
        DrvList.selection = self._src[0]
  

Я получаю сообщение об ошибке

  AttributeError: 'DrvList' object has no attribute 'grid'
  

итак, как я могу получить доступ к сетке? Кроме того, есть какие-либо предложения по созданию такого списка с возможностью перетаскивания, чтобы я мог перемещать элементы в списке с визуальной обратной связью? Но на данный момент наиболее важным является вопрос о том, как я получаю доступ к сетке. self.ids.grid также не работает…

РЕДАКТИРОВАТЬ: Kivy> = 1.11.x, поэтому не 1.10 или ниже

Ответ №1:

Несколько проблем с вашим кодом. Во-первых, ids они создаются при kv применении правил, и я должен признать, что когда они ids действительно доступны, их трудно определить. Однако, как правило, когда ids они недоступны, это можно преодолеть, используя Clock.schedule_once() следующим образом:

 class DrvList(ScrollView):
    selection = StringProperty()

    def __init__(self, *args, **kwargs):
        super(DrvList, self).__init__(*args, **kwargs)
        Clock.schedule_once(self.setup)

    def setup(self, dt):
        self._src = ["C", "D", "E"]
        for x in self._src:
            self.ids.grid.add_widget(ToggleButton(id=x, text=x))
        self.selection = self._src[0]   # Properties should be referenced using "self"
  

Кроме того, обратите внимание, что в ваших kv строках:

     size_hint: (None, None)
    size: 0.95, 0.95
  

вы устанавливаете ScrollView размер менее 1 пикселя на 1 пиксель, поэтому он, скорее всего, не будет виден.

Еще одно замечание заключается в том, что вы kv помещаете a ScrollView внутрь DrvList , но DrvList это a ScrollView , поэтому вы помещаете a ScrollView внутри a ScrollView , что может вызвать трудности при попытке фактической прокрутки.

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

1. Привет и большое спасибо за разработку. Я только начал с kivy и все еще должен привыкнуть к нему. Я предполагал, что при кодировании класса я должен «повторить» базовый класс, такой как Scrollview здесь, но вы правы, что тогда они становятся вложенными. Тем временем я полностью удалил файл kv и в методе classes init создал gridlayout. Кажется, это работает нормально и не зависит от создаваемой внутренней структуры. Спасибо за ваш комментарий о планировании, это поможет в целом при настройке!