在kivy中访问在不同模块中声明的信息的问题

时间:2019-05-07 09:30:18

标签: python kivy

我有一个python文件(root.py)和另一个python文件(button.py)。当我使用kv语言在button.py中定义具有属性(例如size_hint:0.1,1)的按钮时,root.py似乎无法访问该信息。

当我在button.py中使用python定义相同的信息时,root.py似乎能够访问它。

ROOT.PY

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang.builder import Builder
from buttons import *

Builder.load_string("""
<Root>:
    ButtonBar:
""")

class BtnBar(ButtonBar):
    print(self.size_hint) # prints [1,1] instead of [0.1,1]

class Root(FloatLayout):
    pass

class AppDev(App):
    def build(self):
        return Root()

BUTTON.PY

from kivy.uix.floatlayout import FloatLayout
from kivy.lang.builder import Builder

Builder.load_string("""
<ButtonBar>:
    size_hint: 0.1,1
""")

class ButtonBar(FloatLayout):
    pass

Root.py应该能够访问我在button.py的Builder.load_string中声明的任何信息

1 个答案:

答案 0 :(得分:0)

实例化对象后,将可以访问正确的数据。您可以使用时钟来确保实例化后得到它。
同样在您的kv字符串中,您可能希望使用BtnBar而不是ButtonBar
这是您的root.py重写后执行的操作。

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang.builder import Builder
from kivy.clock import Clock
from buttons import *

Builder.load_string("""
<Root>:
    BtnBar: # corrected to BtnBar
""")

class BtnBar(ButtonBar):
    def __init__(self, **kwargs):
        super(BtnBar, self).__init__(**kwargs)
        Clock.schedule_once(self.get_data)

    def get_data(self, dt):
        print(self.size_hint) # prints on second frame

class Root(FloatLayout):
    pass

class AppDev(App):
    def build(self):
        return Root()

AppDev().run()