从单独的文件更改 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
都可以。
这里有两种可能的方法供您使用。第一种是在test
class中定义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()
方法和ScreenManager
的get_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
第一种方法更简单直接。
所以目前我遇到了 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
都可以。
这里有两种可能的方法供您使用。第一种是在test
class中定义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()
方法和ScreenManager
的get_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
第一种方法更简单直接。