2013-06-14 4 views
2

Создание небольшое изменение в list_simple_in_kv.py использовать ListAdapter вместо SimpleListAdapter, я считаю, что метод # 1 работает:Kivy: Почему ListView объявляет иначе в .kv-файле?

from kivy.uix.modalview import ModalView 
from kivy.uix.listview import ListView 
from kivy.uix.gridlayout import GridLayout 
from kivy.lang import Builder 
from kivy.app import App 

#using 'sla'...whatever that means... 
Builder.load_string(""" 
#:import ListItemButton kivy.uix.listview 
#:import sla kivy.adapters.listadapter 

<ListViewModal>: 
    ListView: 
     size_hint: .8, .8 
     adapter: 
      sla.ListAdapter(
      data=["Item #{0}".format(i) for i in range(100)], 
      cls=ListItemButton.ListItemButton) 
""") 

class ListViewModal(ModalView): 
    def __init__(self, **kwargs): 
     super(ListViewModal, self).__init__(**kwargs) 


class MainView(GridLayout): 

    def __init__(self, **kwargs): 
     kwargs['cols'] = 1 
     super(MainView, self).__init__(**kwargs) 

     listview_modal = ListViewModal() 

     self.add_widget(listview_modal) 

class TestApp(App): 
    def build(self): 
     root = MainView() 
     return root 

if __name__ == '__main__': 
    TestApp().run() 

Но изменения файла киловольтной таким образом (путь, который наиболее рядный с другой кВ API, я пришел в поперечнике) не удается:

Builder.load_string(""" 
#:import ListItemButton kivy.uix.listview 
#:import ListAdapter kivy.adapters.listadapter 

<ListViewModal>: 
    size_hint: None, None 
    size: 400, 400 
    ListView: 
     size_hint: .8, .8 
     ListAdapter: 
      data: ["Item #{0}".format(i) for i in range(100)] 
      cls: ListItemButton.ListItemButton 
""") 

я даже наткнулся на this пост и this one too, говоря, что метод # 2 должны работать в мастере, но это yeilds исключения:

File "C:\Python27\lib\site-packages\kivy\adapters\adapter.py", line 102, in __init__ 
    raise Exception('adapter: input must include data argument') 
Exception: adapter: input must include data argument 

Что мне здесь не хватает?

Заранее спасибо.

+0

'sla' инициалы из' SimpleListAdapter', но в вашем случае это 'ListAdapter', так как изменить импорт на верхней' #: импорт Ла kivy.adapters.listadapter'. Я также редактирую ваш пост, потому что я думаю, что есть ошибка вложения –

+0

@toto_tico: Вы правы в отступе. Благодарю. –

+0

@toto_tico, я отклонил ваше редактирование. Если вы хотите исправить синтаксическую ошибку отступа в его коде Python. Вы должны опубликовать его как ответ, а не отредактировать вопрос, иначе это смутит людей, которые рассмотрят этот вопрос позже. –

ответ

1

ListAdapter не является виджетами, поэтому вы не можете использовать синтаксисы, которые вы пытаетесь использовать. Я думаю, что ближайший вы можете сделать, чтобы достичь более кивионного внешнего вида кода, следующим образом. Обратите внимание, что я меняю импорт. Это выглядит так же, как вы добавить инструкции к холсту:

Builder.load_string(""" 
#:import ListItemButton kivy.uix.listview.ListItemButton 
#:import ListAdapter kivy.adapters.listadapter.ListAdapter 

<ListViewModal>: 
    size_hint: None, None 
    size: 400, 400 
    ListView: 
     size_hint: .8, .8 
     adapter: 
      ListAdapter(data=["Item #{0}".format(i) for i in range(100)], cls = ListItemButton) 
""") 

** Редактировать **

Вы также изменили size_hint, так что предыдущий код выглядит очень отличается от оригинала. Этот выглядит как оригинал.

Builder.load_string(""" 
#:import ListItemButton kivy.uix.listview.ListItemButton 
#:import ListAdapter kivy.adapters.listadapter.ListAdapter 

<ListViewModal>: 
    ListView: 
     size_hint: .8, .8 
     adapter: 
      ListAdapter(data=["Item #{0}".format(i) for i in range(100)], cls = ListItemButton) 
""") 
+0

«Адаптер списка - это не виджет ...» Интересно, почему ... Очень полезно. Спасибо. –

+0

Поскольку виджеты - это компоненты, которые вы добавляете иерархически к графическому пользовательскому интерфейсу. «Виджет» «ListView» может работать с различными типами эструсов данных через его свойство адаптера. «ListAdapter» - это еще один [адаптер] (http://en.wikipedia.org/wiki/Adapter_pattern), который меняет структуру данных, которую Widget может работать с –

+0

. Я просто говорю, что этого не должно быть. Kv-файл * awesome *, потому что он делает вещи намного проще. У него не должно быть обезьян-гаечных ключей, как это ... Как мне донести это до «более высоких» Kivy? –

0

Я не уверен в этом ответе, но вы ничего не добавляете к свойству adapter. Попробуйте следующее:

Builder.load_string(""" 
#:import ListItemButton kivy.uix.listview 
#:import ListAdapter kivy.adapters.listadapter 

<ListViewModal>: 
    size_hint: None, None 
    size: 400, 400 
    ListView: 
     size_hint: .8, .8 
     adapter: 
      ListAdapter.ListAdapter: 
       data: ["Item #{0}".format(i) for i in range(100)] 
       cls: ListItemButton.ListItemButton 
""") 

Я согласен с тем, что sla.ListAdapter не ясен. Обычно мы имеем доступ к классу напрямую. Скажите мне, если это работает:

Builder.load_string(""" 
#:import ListItemButton kivy.uix.listview.ListItemButton 
#:import ListAdapter kivy.adapters.listadapter.ListAdapter 

<ListViewModal>: 
    size_hint: None, None 
    size: 400, 400 
    ListView: 
     size_hint: .8, .8 
     adapter: 
      ListAdapter: 
       data: ["Item #{0}".format(i) for i in range(100)] 
       cls: ListItemButton 
""") 

Обратите внимание, что я изменить импорт ListItemButton и ListAdapter.

+1

Нет кубиков ... получена ошибка: 'Недопустимый отступ (слишком много уровней)'. –

+0

жаль, что я пропустил одно пустое место на последнем уровне отступов, я ставлю 3 вместо 4 ... ошибка дублируется в обеих попытках ответа. –

+0

Все тот же результат ... это сработает для вас? –

Смежные вопросы