我正在使用Kivy for python,我想知道是否有办法访问我在.kv文件中声明的一些变量,如下所示:
#:set global_background_color_A (0.4,0.4,0.4, 1)
#:set global_background_color_B (0.2,0.2,0.2, 1)
#:set global_background_color_C (0.6,0.6,0.6, 1)
#:set global_seperator_color_Blue (0.26,.545,.65,1)
现在,如果我可以在我的python代码中动态更改某些按钮的背景颜色,那将是非常好的。为此,我必须访问这些变量。
最简单的方法是什么?
提前致谢, 芬兰
答案 0 :(得分:2)
我使用以下代码作为示例应用程序:
controller.kv
#:kivy 1.0
#:set global_background_color_A (0.4,0.4,0.4, 1)
#:set global_background_color_B (0.2,0.2,0.2, 1)
#:set global_background_color_C (0.6,0.6,0.6, 1)
#:set global_seperator_color_Blue (0.26,.545,.65,1)
<Controller>:
label_wid: my_custom_label
button_wid: my_custom_button
BoxLayout:
orientation: 'vertical'
padding: 20
Button:
id: my_custom_button
text: 'My controller info is: ' + root.info
on_press: root.do_action()
Label:
id: my_custom_label
text: 'My label before button press'
__main__.py
import kivy
kivy.require('1.0.5')
from kivy.uix.floatlayout import FloatLayout
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty
from kivy.lang.parser import global_idmap # <--
class Controller(FloatLayout):
'''Create a controller that receives a custom widget from the kv lang file.
Add an action to be called from the kv lang file.
'''
label_wid = ObjectProperty()
info = StringProperty()
def do_action(self):
kv_var = global_idmap['global_background_color_A'] # <--
self.label_wid.text = str(kv_var) # <--
self.info = 'New info text'
class ControllerApp(App):
def build(self):
return Controller(info='Hello world')
if __name__ == '__main__':
ControllerApp().run()
我用箭头标记了__main__.py
中的重要行。
如果您查看kv语言解析器here,您可以看到它使用set
命令执行的操作。它会进行一些错误检查,eval()
是容器global_idmap
中的值。
现在,我不认为这是值得推荐的。正如您所见,here,kivy特别不会公开global_idmap
。我认为这是一个不应该依赖的实现细节。
如果你想在代码中改变你的东西的颜色,你可以这样做:
def do_action(self):
...
self.button_wid.background_color = (1, 0, 1, 1)