Kivy Scrollview:AttributeError:“NoneType”对象没有属性“绑定”

Posted

技术标签:

【中文标题】Kivy Scrollview:AttributeError:“NoneType”对象没有属性“绑定”【英文标题】:Kivy Scrollview: AttributeError: 'NoneType' object has no attribute 'bind' 【发布时间】:2020-12-27 15:14:47 【问题描述】:

早安,

我是这个网站的新手,但我经常控制有助于我编码的主题。我刚开始学习编码,我是 python 新手,我认为它是最好的之一。

顺便说一句:我正在使用 Kivy 构建一个由用户可以收集和查阅的卡片组成的应用程序。我制作了卡片(使用 MDCards),但屏幕被挡住了,如果我添加超过 5 张卡片,它们是不可见的(屏幕外)。我正在尝试在 KV 的 GridLayout 上添加滚动视图。遵循一些主题,我发现了这种方式。

from kivy.properties import ObjectProperty
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.scrollview import ScrollView
from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window
from kivy.uix.gridlayout import GridLayout
from kivy.app import runTouchApp
from kivy.uix.button import Button

KV = """
Screen:
    Controller:
        layout_content: layout_content
        BoxLayout:
            id: bl
            orientation: 'vertical'
            padding: 10, 10
            row_default_height: '48dp'
            row_force_default: True
            spacing: 10, 10
            ScrollView:
                size: self.size
                GridLayout:
                    id: layout_content
                    size_hint_y: None
                    cols: 1
                    row_default_height: '20dp'
                    row_force_default: True
                    spacing: 0, 0
                    padding: 0, 0
                    
                    MDCard:
                        id: tel1
                        orientation: "vertical"
                        padding: "8dp"
                        size_hint: None, None
                        size: "180dp", "280dp"
                        pos_hint: "center_x": 0.5, "center_y": 0.5
                        MDLabel: 
                            text: "Tele 1"
                            theme_text_color: "Secondary"
                            size_hint_y: None
                            height: self.texture_size[1]
                        MDSeparator:
                            height: "5dp"
                            width: "5dp"
                        MDLabel: 
                            text: "Descrizione del primo"
                    MDCard:
                        id: tel2
                        orientation: "vertical"
                        padding: "8dp"
                        size_hint: None, None
                        size: "180dp", "280dp"
                        pos_hint: "center_x": 0.5, "center_y": 0.5
                        MDLabel: 
                            text: "Tele 2"
                            theme_text_color: "Secondary"
                            size_hint_y: None
                            height: self.texture_size[1]
                        MDSeparator:
                            height: "5dp"
                            width: "5dp"
                        MDLabel: 
                            text: "Descrizione del secondo"
                    MDCard:
                        id: tel2
                        orientation: "vertical"
                        padding: "8dp"
                        size_hint: None, None
                        size: "180dp", "280dp"
                        pos_hint: "center_x": 0.5, "center_y": 0.5
                        MDLabel: 
                            text: "Tele 3"
                            theme_text_color: "Secondary"
                            size_hint_y: None
                            height: self.texture_size[1]     
                        MDSeparator:
                            height: "5dp"
                            width: "5dp"
                        MDLabel: 
                            text: "Descrizione del terzo" 
                    MDCard:
                        id:tel4
                        orientation: "vertical"
                        padding: "8dp"
                        size_hint: None, None
                        size: "180dp", "280dp"
                        pos_hint: "center_x": 0.5, "center_y": 0.5
                        MDLabel: 
                            text: "Telefilm 4"
                            theme_text_color: "Secondary"
                            size_hint_y: None
                            height: self.texture_size[1]
                        MDSeparator:
                            height: "5dp"
                            width: "5dp"
                        MDLabel: 
                            text: "Descrizione del quarto"
                    MDCard:
                        id:tel5
                        orientation: "vertical"
                        padding: "8dp"
                        size_hint: None, None
                        size: "180dp", "280dp"
                        pos_hint: "center_x": 0.5, "center_y": 0.5
                        MDLabel: 
                            text: "Tele 5"
                            theme_text_color: "Secondary"
                            size_hint_y: None
                            height: self.texture_size[1]
                        MDSeparator:
                            height: "5dp"
                            width: "5dp"
                        MDLabel: 
                            text: "Descrizione del quinto"                 
"""

class Controller(FloatLayout):
    layout_content = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(Controller, self).__init__(**kwargs)
        self.layout_content.bind(minimum_height=self.layout_content.setter('height'))

class MainApp(MDApp):
    def build(self):
        self.title = "LukeFlix"
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_palette = "Red"
        return Builder.load_string(KV)

MainApp().run()

但我收到此错误:

 Traceback (most recent call last):
   File "C:/Users/User/PycharmProjects/pythonProject3APP/main.py", line 140, in <module>
     MainApp().run()
   File "C:\Users\User\PycharmProjects\pythonProject3APP\venv\lib\site-packages\kivy\app.py", line 949, in run
     self._run_prepare()
   File "C:\Users\User\PycharmProjects\pythonProject3APP\venv\lib\site-packages\kivy\app.py", line 919, in _run_prepare
     root = self.build()
   File "C:/Users/User/PycharmProjects/pythonProject3APP/main.py", line 132, in build
     return Builder.load_string(KV)
   File "C:\Users\User\PycharmProjects\pythonProject3APP\venv\lib\site-packages\kivy\lang\builder.py", line 408, in load_string
     self._apply_rule(
   File "C:\Users\User\PycharmProjects\pythonProject3APP\venv\lib\site-packages\kivy\lang\builder.py", line 659, in _apply_rule
     child = cls(__no_builder=True)
   File "C:/Users/User/PycharmProjects/pythonProject3APP/main.py", line 125, in __init__
     self.layout_content.bind(minimum_height=self.layout_content.setter('height'))
 AttributeError: 'NoneType' object has no attribute 'bind'

Process finished with exit code 1

我该如何解决?

【问题讨论】:

【参考方案1】:

该错误是由Controller 类的__init__() 方法引起的。此时,尚未分配 layout_content 属性。您可以通过像这样重新定义Controller 来消除__init__() 方法:

class Controller(FloatLayout):
    pass

然后通过修改kvScrollView 部分来实现相同的预期结果:

        ScrollView:
            # size: self.size   # this has no effect
            GridLayout:
                id: layout_content
                size_hint_y: None
                cols: 1
                # row_default_height: '20dp'
                # row_force_default: True
                height: self.minimum_height
                spacing: 0, 0
                padding: 0, 0

注意height: self.minimum_height 行,它执行您的__init__() 方法试图做的事情。此外,行默认值会强制GridLayout 中的行高度太小。

【讨论】:

伟大的@John Anderson。它奏效了,我都明白了。非常感谢!

以上是关于Kivy Scrollview:AttributeError:“NoneType”对象没有属性“绑定”的主要内容,如果未能解决你的问题,请参考以下文章

没有为kivy获取ScrollView

Kivy:将 ScrollView 移动到某个 y

Kivy ScrollView 用于文本段落

Kivy - 创建一个可扩展的 ScrollView

ScrollView 中的 Kivy StackLayout

将 ScrollView 添加到 kivy 弹出窗口