我试图在我的。kv文件中与一些BoxLayout元素接口,但是当我在另一个类中调用类中的函数时,ID的父加载。
main.py文件:
class FreeStyleScreen(Screen):
def __init__(self, **kwargs):
super(FreeStyleScreen, self).__init__(**kwargs)
self.draw_card = FreeStyle().draw_card
class MainMenuScreen(Screen):
pass
class TarotApp(App):
def build(self):
sm = ScreenManager()
sm.add_widget(MainMenuScreen(name='mainmenu'))
sm.add_widget(FreeStyleScreen(name='freestyle'))
return sm
if __name__ == '__main__':
TarotApp().run()
freestyle.py文件:
class FreeStyle(BoxLayout):
def __init__(self, *args, **kwargs):
super(FreeStyle, self).__init__(*args, **kwargs)
self.store = JsonStore('cards.json')
self.cards = {'card1': 'Example Card'}
def draw_card(self):
self.card1.text = self.cards['card1']
tarotapp.kv:
ScreenManager:
MainMenuScreen:
name: 'mainmenu'
FreeStyleScreen:
name: 'freestyle'
<MainMenuScreen>
BoxLayout:
orientation: 'vertical'
Label:
text: "Main Menu"
Button:
text: "Free Style"
on_release: root.manager.current = 'freestyle'
<FreeStyleScreen>
card1: card1
BoxLayout:
orientation: "vertical"
Label:
id: card1
text: ""
Button:
text: "Draw Cards"
on_release: root.draw_card()
但是我总是得到错误
AttributeError: 'FreeStyle' object has no attribute 'card1'. Did you mean: 'cards'?
当我从构建函数返回一个FreeStyle实例时,它工作得很好,但是当我从FreeStyleScreen类调用该函数时,它不加载ID。我做错了什么?
这是因为FreeStyle(BoxLayout)没有任何id,也不需要BoxLayout,因为它是一个普通的类,更适合用于OOP(面向对象编程)
FreeStyle类应该是这样的:
class FreeStyle:
def __init__(self, **kwargs):
super(FreeStyle, self).__init__(**kwargs)
self.store = JsonStore('cards.json')
self.cards = {'card1': 'Example Card'}
def draw_card(self):
return self.cards['card1']
和你创建屏幕管理器的方式,你不需要在kv文件中的屏幕管理器:
<MainMenuScreen>
BoxLayout:
orientation: 'vertical'
Label:
text: "Main Menu"
Button:
text: "Free Style"
on_release: root.manager.current = 'freestyle'
<FreeStyleScreen>
card1: card1
BoxLayout:
orientation: "vertical"
Label:
id: card1
text: ""
Button:
text: "Draw Cards"
on_release: root.draw_card()
如果你想在kv文件中使用screenmanager你应该返回kv文件,像这样:
class TarotApp(App):
def build(self):
return Builder.load_file('test.kv')
希望有帮助