簡體   English   中英

Kivy 在 python 中動態訪問滾動視圖中的 gridlayout

[英]Kivy access gridlayout within scrollview dynamically in python

我正在嘗試將標簽/按鈕添加到 Scrollview 中的 GridLayout,但不知何故我無法在 python 中訪問 GridLayout。 考慮以下 .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 或更低

您的代碼存在一些問題。 首先是在應用kv規則時創建了ids ,我必須承認這些ids何時真正可用似乎很難定義。 但是,通常當ids不可用時,可以通過使用Clock.schedule_once()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 ,以下kv行:

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

正在將ScrollView大小設置為小於 1 x 1 像素,因此它可能不可見。

另外一個值得注意的是,你的kv ,看跌期權的ScrollViewDrvList ,但DrvListScrollView ,所以你放置一個ScrollView一內ScrollView ,當你嘗試實際滾動可能造成困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM