python - 不鼓励使用 kivy 动态添加属性——为什么?

标签 python kivy

kivy.event.EventDispatcher 类有一个名为 apply_property() 的方法它允许在运行时向类添加属性。 文档包含警告:

This method is not recommended for common usage because you should declare the properties in your class instead of using this method.

我不清楚为什么不鼓励这种用法,而首选在类中声明。谁能赐教一下?

最佳答案

apply_property() 用于将属性添加到单个类实例,但也有污染其他实例属性的副作用。考虑以下代码:

#!/usr/bin/kivy
import kivy
kivy.require('1.9.1')

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

Builder.load_string('''
<MyButton>:
    on_press: print('np' in self.properties())
''')

class MyButton(Button):
    pass

class MainApp(App):
    def build(self):
        mb1 = MyButton(text="mb1")
        mb2 = MyButton(text="mb2")
        mb1.apply_property(np=NumericProperty(100))

        layout = BoxLayout()
        layout.add_widget(mb1)
        layout.add_widget(mb2)
        return layout

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

如您所见,即使我在 mb1 实例上使用了 apply_propertymb2 报告它也有这样的属性。这是因为属性被添加到类中,而不是实例中。但是,只有 mb1 具有实际值:

#!/usr/bin/kivy
import kivy
kivy.require('1.9.1')

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

Builder.load_string('''
<MyButton>:
    on_press: print(self.np)
''')

class MyButton(Button):
    pass

class MainApp(App):
    def build(self):
        mb1 = MyButton(text="mb1")
        mb2 = MyButton(text="mb2")
        mb1.apply_property(np=NumericProperty(100))

        layout = BoxLayout()
        layout.add_widget(mb1)
        layout.add_widget(mb2)
        return layout

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

尝试从 mb2 实例获取 np 属性的值会产生一个 AttributeError。一个安全的选择:

#!/usr/bin/kivy
import kivy
kivy.require('1.9.1')

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

Builder.load_string('''
<MyButton>:
    on_press: print(self.np)
''')

class MyButton(Button):
    np=NumericProperty(100)

class MainApp(App):
    def build(self):
        mb1 = MyButton(text="mb1")
        mb2 = MyButton(text="mb2")

        layout = BoxLayout()
        layout.add_widget(mb1)
        layout.add_widget(mb2)
        return layout

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

来源:this issue .

关于python - 不鼓励使用 kivy 动态添加属性——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519358/

相关文章:

python - 自定义Python获取BDay范围

Python:数据分析的PCA问题

Python:从html获取 "id"或 "data-value"?

python - 在具有不同重数但相同维度的数组上同时使用 numpy repeat

android - kivy python 程序在 android 上启动时立即关闭

python - 如何以编程方式在python中为caffe生成deploy.txt

java - 适用于 Android 应用的 Kivy 和 Java 之间的区别

macos - Virtualenv 中的 Kivy 对 SDL2 的支持

python - 如何加载.kv 文件?

python : How to make label bold in kivy