Kivy:未知类< ListView>错误代码 [英] Kivy: Unknown class <ListView> error code
问题描述
这是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.
- 模型:模型由 RecycleViewBehavior .
- 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,请将以下类作为视图类.该项目通常是一个小部件,例如标签, BoxLayout 或
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()
, orSelectableRecycleGridLayout()
- Selectable widget class, e.g.
SelectableLabel()
,SelectableButton()
, orSelectableRow()
- 为以下示例说明了使用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:未知类< ListView>错误代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!