python - 无法将 .kv 文件中的对象连接到 python 类

标签 python kivy kivy-language

我正在学习 Kivy 并且无法将我在 .kv 文件中声明的对象连接到 python 类以更新它们的属性。无论我尝试哪种方式,我都会收到此错误:

self.kbCompressionLabel.text = 'Hello World'
AttributeError: 'NoneType' object has no attribute 'text'

应用程序可以很好地加载所有 kivy 文件,只有在我尝试从类更新时才会中断。

我已将当前代码精简到最低限度以说明其设置方式。任何帮助深表感谢。

主应用入口

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager

Builder.load_file('appscreenmanager.kv')
Builder.load_file('compressorscreen.kv')
Builder.load_file('slidersview.kv')

class AppScreenManager(ScreenManager):
    pass

class AppManager(App):
    def build(self):
        return AppScreenManager()

if __name__ == "__main__":
    AppManager().run()

下载 appscreenmanager.kv

#:kivy 1.10.0

<AppScreenManager>:
    CompressorScreen:
    ...

压缩器屏幕.kv

<CompressorScreen>:
    name: 'compressor'
    GridLayout:
        rows: 4
        cols: 1
    SlidersView:
    ...

这就是问题所在:简化的 slidersview.kv

#:kivy 1.10.0
#:import slidersview slidersview

<slidersView>:
    cols: 4
    rows: 2
    id: sliders
    kbCompressionLabel: kbCompressionLabel

    Label:
        id: kbCompressionLabel
        text: 'test'

slider View .py

import kivy
kivy.require('1.10.0')

from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty

class SlidersView(GridLayout):
    # properties
    sliders = ObjectProperty(None)
    kbCompressionLabel = ObjectProperty(None)

    def __init__(self, **kwargs):
        self.kbCompressionLabel.text = 'Hello World'
        super(SlidersView, self).__init__(**kwargs)

更新

我不得不在 init 函数中添加延迟,然后一切正常。但是,这对我来说感觉很不稳定。这是预期的行为吗?

更新了 slidersview.py

import kivy
kivy.require('1.10.0')

from kivy.clock import mainthread
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty

class SlidersView(GridLayout):
    # properties
    kbCompressionLabel = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(SlidersView, self).__init__(**kwargs)
        @mainthread
        def delayed():
            self.kbCompressionLabel.text = 'Hello World'
        delayed()

最佳答案

仅当您调用基类的 __init__ 时才应用 KV 定义... 颠倒顺序,你会没事的......

class SlidersView(GridLayout):
    # properties
    sliders = ObjectProperty(None)
    kbCompressionLabel = ObjectProperty(None)

    def __init__(self, **kwargs):

        super(SlidersView, self).__init__(**kwargs) #first!
        self.kbCompressionLabel.text = 'Hello World' #2nd!

关于python - 无法将 .kv 文件中的对象连接到 python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45699718/

相关文章:

python - 将 numpy 数组的每个元素相乘并求和

android - 如何在kivy项目中隐藏python代码文件和其他相关文件

python - Kivy 日期选择器小工具

linux - 为什么错误 urllib.error.ContentTooShortError :

python - 尝试向下滚动带有水平 ScrollView 的垂直 ScrollView 时,Kivy 出现问题

python - 更改 KivyMD 中 MDDropdownMenu 中 2 个按钮的文本

bool 值作为索引的 Python 效果 (a[a==0] = 1)

python - 如何在 C 中定义结构

python - open() 不在 for 循环中打开文件描述符

python - 如何根据焦点设置Kivy TextInput背景颜色