Kivy:未知类< ListView>错误代码 [英] Kivy: Unknown class <ListView> error code

查看:143
本文介绍了Kivy:未知类< ListView>错误代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是main.py

from kivy.app import App


class WeatherApp(App):
    pass


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

weather.kv是:

weather.kv is:

AddLocationForm:

<AddLocationForm@BoxLayout>:
    orientation: 'vertical'
    BoxLayout:
        TextInput:
        Button:
            text: "Search"
        Button:
            text: "Current Location"
    ListView:
        item_strings: ["Palo Alto, MX", "Palo Alto, US"]

它似乎无法识别列表视图.我已经看到其他使用从kivy.uix.listview导入ListView"的listview了,但这也不起作用,我也不知道为什么.

It doesn't seem to recognize listview. I have seen other use listview with "from kivy.uix.listview import ListView" but that doesn't work either, i do not know why.

kivy.factory.FactoryException:未知类

kivy.factory.FactoryException: Unknown class

推荐答案

Kivy ListView»已弃用

在最近发布的稳定Kivy版本1.11.0中不再定义ListView.

Kivy ListView » Deprecated

ListView is no longer defined in the recently released stable Kivy version 1.11.0.

通过处理数据,本质上是一个列表 格,并使用这些格来生成 viewclass 作为必需的.其设计基于MVC (模型视图控制器)模式.

The view is generatad by processing the data, essentially a list of dicts, and uses these dicts to generate instances of the viewclass as required. Its design is based on the MVC (Model-view-controller) pattern.

  • 模型:模型由
  • Model: The model is formed by data you pass in via a list of dicts.
  • View: The View is split across layout and views and implemented using adapters.
  • Controller: The controller determines the logical interaction and is implemented by RecycleViewBehavior.

解决方案

要创建可选项目的RecycleView,请将以下类作为视图类.该项目通常是一个小部件,例如标签

Solution

To create a RecycleView of selectable item, implement the following classes as part of the viewclass. The item is usually a widget e.g. Label, Button, or a group/row of widgets in a layout (BoxLayout or GridLayout).

  • Selectabel回收站布局类,例如SelectableRecycleBoxLayout()SelectableRecycleGridLayout()
  • 可选择的小部件类,例如SelectableLabel()SelectableButton()SelectableRow()
  • Selectabel recycle layout class, e.g. SelectableRecycleBoxLayout(), or SelectableRecycleGridLayout()
  • Selectable widget class, e.g. SelectableLabel(), SelectableButton(), or SelectableRow()
  • 以下示例说明了使用RecycleView等效于ListView的方法. 视图类 RecycleBoxLayout : //kivy.org/doc/stable/api-kivy.uix.label.html"rel =" nofollow noreferrer>标签小部件.该应用程序正在使用 OpenWeatherMap

    The following example illustrates the equivalence of a ListView by using RecycleView. The viewclass is a selectable RecycleBoxLayout of Label widget. The app is using OpenWeatherMap's API to retrieve a sample weather data of London, GB (Great Britain).

    要使用真实的API点调用OpenWeatherMap,您需要 API密钥(APPID).

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.recycleview.views import RecycleDataViewBehavior
    from kivy.uix.label import Label
    from kivy.properties import BooleanProperty, ObjectProperty
    from kivy.uix.recycleboxlayout import RecycleBoxLayout
    from kivy.uix.behaviors import FocusBehavior
    from kivy.uix.recycleview.layout import LayoutSelectionBehavior
    from kivy.network.urlrequest import UrlRequest
    from kivy.lang import Builder
    
    import json
    
    
    class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                     RecycleBoxLayout):
        ''' Adds selection and focus behaviour to the view. '''
    
    
    class SelectableLabel(RecycleDataViewBehavior, Label):
        ''' Add selection support to the Label '''
        index = None
        selected = BooleanProperty(False)
        selectable = BooleanProperty(True)
    
        def refresh_view_attrs(self, rv, index, data):
            ''' Catch and handle the view changes '''
            self.index = index
            return super(SelectableLabel, self).refresh_view_attrs(
                rv, index, data)
    
        def on_touch_down(self, touch):
            ''' Add selection on touch down '''
            if super(SelectableLabel, self).on_touch_down(touch):
                return True
            if self.collide_point(*touch.pos) and self.selectable:
                return self.parent.select_with_touch(self.index, touch)
    
        def apply_selection(self, rv, index, is_selected):
            ''' Respond to the selection of items in the view. '''
            self.selected = is_selected
    
    
    class AddLocationForm(BoxLayout):
        search_input = ObjectProperty()
        search_results = ObjectProperty()
    
        def search_location(self):
            search_template = "https://samples.openweathermap.org/data/2.5/find?q={}&appid=b6907d289e10d714a6e88b30761fae22"
            # search_template = "https://api.openweathermap.org/data/2.5/find?q={}&typle=like&appid=xyz"    # Replace 'xyz' with your API Key (APPID)
            search_url = search_template.format(self.search_input.text)
            request = UrlRequest(search_url, self.found_location)
    
        def found_location(self, request, data):
            data = json.loads(data.decode()) if not isinstance(data, dict) else data
            cities = ["{} ({})".format(d['name'], d['sys']['country']) for d in data['list']]
            self.search_results.data = [{'text': str(x)} for x in cities]
            print(f"self.search_results.data={self.search_results.data}")
    
    
    class WeatherRoot(BoxLayout):
        pass
    
    
    class TestApp(App):
        title = "Weather App"
    
        def build(self):
            return Builder.load_file("main.kv")
    
    
    if __name__ == '__main__':
        TestApp().run()
    

    main.kv

    WeatherRoot:
    
    <WeatherRoot>:
        AddLocationForm:
    
    <SelectableLabel>:
        # Draw a background to indicate selection
        canvas.before:
            Color:
                rgba: (1, 0, 0, 1) if self.selected else (.0, 0.9, .1, .3)
            Rectangle:
                pos: self.pos
                size: self.size
            Color:
                rgba: (0, 0.9, .1, .3)
            Rectangle:
                pos: self.pos
                size: self.size
    
    <AddLocationForm>:
        orientation: "vertical"
    
        search_input: search_input
        search_results: search_results_list
    
        BoxLayout:
            height: "40dp"
            size_hint_y:None
    
            TextInput:
                id: search_input
                size_hint_x: 50
                focus: True
                multiline: False
                hint_text: 'Your city name'
                on_text_validate: root.search_location()
    
    
            Button:
                text: "Search"
                size_hint_x: 25
                on_press: root.search_location()
    
            Button:
                text: "Current Location"
                size_hint_x: 25
    
        RecycleView:
            id: search_results_list
    
            viewclass: 'SelectableLabel'
    
            SelectableRecycleBoxLayout:
                default_size: None, dp(26)
                default_size_hint: 1, None
                size_hint_y: None
                height: self.minimum_height
                orientation: 'vertical'
                multiselect: True
                touch_multiselect: True
    

    输出

    这篇关于Kivy:未知类&lt; ListView&gt;错误代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆