Kivy类在.py和.kv中的交互

时间:2015-04-30 13:14:37

标签: python class kivy

我并没有完全理解python文件中的类和kivy语言之间的交互方式。我正在修改Kivy的Showcase示例以增加我的理解。

文件结构

  • main.py
  • showcase.kv
  • 数据/画面/ test.kv

main.py

class Testy(BoxLayout):
    ttext = 'Bla'
    #other code

class ShowcaseScreen(Screen):
    fullscreen = BooleanProperty(False)

    def add_widget(self, *args):
        if 'content' in self.ids:
            return self.ids.content.add_widget(*args)
        return super(ShowcaseScreen, self).add_widget(*args)


class ShowcaseApp(App):
    #code

test.kv

<Testy>:
    orientation: 'vertical'

    Label:
        text: root.ttext

ShowcaseScreen:
    name: 'LearnKanji'
    fullscreen: True
    #Some ref to <Testy>

问题

我想在Testy()中使用我的代码,因为我打算编写大量代码,针对单个屏幕中发生的事情,我不想让ShowcaseScreen()混乱,因为ShowcaseScreen也意味着对于其他屏幕。

澄清一下,在test.kv中我指的是变量ttext。如果我没有上课Testy(),我会按如下方式进行:

ShowcaseScreen:
    name: 'LearnKanji'
    fullscreen: True
    BoxLayout:
        text: root.ttext

然后在main.py中我需要把

class ShowcaseScreen(Screen):
    ttext = 'Bla'

然而,由于除了Testy之外的许多屏幕都使用了ShowcaseScreen()类,所以将所有屏幕的所有代码放在这里会使它太乱了。因此,我希望每个屏幕的代码在一个单独的类中。我认为这是更大的代码项目的更好方法。

那么在test.kv文件中调用ShowcaseScreen之后如何引用?这样我就可以将Testy中的代码放在Testy()中,并保持我的文件和类更有条理。

跟进问题:Kivy class in .py and .kv interaction 2

1 个答案:

答案 0 :(得分:1)

您可以使用ScreenManager。看看这里,我改变了一些代码,提供了一个使用ScreenManager将每个屏幕的代码分离到自己的类中的示例。如果有问题,请告诉我。

<强> main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty


class Testy(Screen):

    ttext = 'Screen 2'
    #other code

class ScreenTwo(Screen):
    pass

class Manager(ScreenManager):

    testy = ObjectProperty(None)
    screen_2 = ObjectProperty(None)


class ShowcaseApp(App):

    def build(self):
        return Manager(transition=FadeTransition())

if __name__ == "__main__":
    ShowcaseApp().run()

kv档案:

<Testy>:
    BoxLayout:
        Button:
            text: root.ttext
            on_press: root.manager.current = "screen_two"

<ScreenTwo>:
    BoxLayout:
        Button:
            text: "Screen 1"
            on_press: root.manager.current = "testy_screen"


<Manager>:
    id: screen_manager

    testy: testy
    screen_2: screen_2

    Testy:
        id: testy
        name: 'testy_screen'
        manager: screen_manager

    ScreenTwo:
        id: screen_2
        name: 'screen_two'
        manager: screen_manager