从单独的文件更改 Kivy 属性 的值

Change Value of a Kivy Property from a seperate File

所以目前我遇到了 Kivy 的问题,我无法解决。 我有一种情况,我想从另一个程序“B”更改文件“A”中的 Kivy NumericProperty 的值,因此所有 Kivy 界面内容所在的程序“C”检测到更改并更新屏幕上的值。

文件“A”(称为 Testvars)只是一个文件,我想在其中声明和存储 Kivy 属性以便更清楚。

from kivy.properties import BoundedNumericProperty
    
value = BoundedNumericProperty(20, min = 0, max = 24)

文件“B”稍后应该能够访问和更改这些属性的值。

import testvars as testvars

testvars.value = testvars.value + 1

文件“C”是我的实际 Kivy 程序,但也可以更改“A”中的值

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager
from kivy.properties import NumericProperty
from kivy.lang import Builder
import testvars as testvars

class test(ScreenManager):
    value = testvars.value
     
        
class Main(App):

    def build(self):
        Builder.load_file('test.kv')
        return test()
        

Main().run()

和 KV 文件:

<test>:
Screen:
    Label:
        text: str(root.value)
        halign: "center"
    Button:
        text: "++"
        size_hint: .1, .08
        pos_hint: {"center_x":.5}
        on_release: root.value = root.value +1

我的问题在文件“B”中。到目前为止,我设法让“C”中的 Kivy 可以访问“A”中的属性,并修改这些值并检测和显示我从“C”中所做的更改。但是,当我尝试将“A”中的值从“B”更改时,我返回一个错误,说我无法将整数添加到 BoundedNumericProperty 对象。到目前为止,我没有在 Kivy 手册中找到适合我的功能。

提前致谢。

kivy Property 必须在 EventDispatcher 中定义。 documentation 表示:

The Properties classes are used when you create an EventDispatcher.

Property objects live at the class level and manage the values attached to instances. Re-assigning at class level will remove the Property.

因此,您的 BoundedNumericProperty 必须在 EventDispatcher class 中定义。通常,这将是 Widget,但任何 EventDispatcher 都可以。

这里有两种可能的方法供您使用。第一种是在testclass中定义BoundedNumericProperty,只用testvars存储一个初始值。这看起来像这样,在 testvars class:

INITIAL_BOUNDED_VALUE = 20

并在 test 中用作:

class test(ScreenManager):
    value = BoundedNumericProperty(testvars.INITIAL_BOUNDED_VALUE, min = 0, max = 24)

您可以通过访问 test class 实例从第三个位置修改 Property 的值。可能是通过使用App.get_running_app()方法和ScreenManagerget_screen()方法。

第二种方法,如果你需要在 testvars 中实际使用 BoundedNumericProperty,是在 testvars 中定义一个包含 Property 的 class ]:

from kivy.event import EventDispatcher
from kivy.properties import BoundedNumericProperty

class TestVars(EventDispatcher):
    value = BoundedNumericProperty(20, min=0, max=24)

    def __new__(cls):
        # ensure this is a singleton
        if not hasattr(cls, 'instance'):
            cls.instance = super(TestVars, cls).__new__(cls)
        return cls.instance

tv = TestVars()

以上代码定义了一个单例 class TestVars 并将实例创建为 tv。在这种方法中,test class:

中不再有任何 Property
class test(ScreenManager):
    # value = ObjectProperty(testvars.tv.value, rebind=True)
    pass

并且 Property 直接从 kv 文件中引用:

#:import testvars testvars
<test>:
    Screen:
        Label:
            text: str(testvars.tv.value)
            halign: "center"
        Button:
            text: "++"
            size_hint: .1, .08
            pos_hint: {"center_x":.5}
            on_release: testvars.tv.value += 1

在第三个位置,您可以将值更改为:

import testvars as testvars

testvars.tv.value = testvars.tv.value + 1

第一种方法更简单直接。