当从另一个类调用函数时,Python Kivy不从kv文件加载id



我试图在我的。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')

希望有帮助

最新更新