.py 和 .kv 交互中的 Kivy class 2

Kivy class in .py and .kv interaction 2

跟进 ,但更复杂。

Here 是我正在写的完整代码:

data/screens/learnkanji_want.kv 有我想要的代码,但我不完全理解如何class KanjiOriginScreen() 在屏幕管理中发挥作用。

data/screens/learnkanji.kv 可以按我想要的方式工作,但要使其正常工作,我必须将 keyb_height 在 class KanjiOriginScreen()main.py)。但是我希望该代码位于 class LayoutFunction() (learnkanji.py).

问题

如何将 keyb_height 放入函数 LayoutFunction() 并在 <LayoutFunction>.kv 文件中访问它?

你能解释一下为什么 KanjiOriginScreen: 可以放在 learnkanji.kv 而没有 < >并且程序仍然识别它应该使用这个?

如有不明之处请追问:)

编辑

我发现我没有在 learnkanji.kv 文件中导入 learnkanji.py,导致找不到 class 'LayoutFunction'。

#:import learnkanji data.screens.learnkanji

回答您的问题:

  1. 您的操作方式应该可行。您应该能够从 kv 访问对象属性。但是,如果您的属性将要更改,并且您希望 UI 在更改时更新,您应该使用 Kivy Properties。如果它是常量,则正常属性可以正常工作。

  2. Kivy Docs 开始,<Widget>: 是一个 class 规则,它将应用于每个 class 的实例 Widget: 将创建那个 class 的实际 实例 (在本例中它是您的根小部件)。

至于ScreenManager和Screens,你可以这么想。每个屏幕都是它自己的个体 UI(它是自己的根小部件)。屏幕管理器是一个容器,用于容纳您的屏幕并可以在不同屏幕之间切换。这使您可以创建单独的 UIs,您可以在它们之间切换。每个 UI 都是一个单独的小部件树,其根部有一个屏幕。 docs 实际上非常擅长描述 ScreenManager。

如何将 keyb_height 放入函数 LayoutFunction() 并在 .kv 文件中访问它?

你不能用函数来做到这一点。您需要将 LayoutFunction 变成 class 才能执行此操作。像这样:

main.py

class LayoutClass(BoxLayout): # I made it a boxlayout, you could make it anything you want

    keyb_height = NumericProperty(260) # from kivy.properties import NumericProperty

kv 文件:

<LayoutClass>: # can only access it this way if it's a class in main.py

    something: root.keyb_height

您能否也解释一下为什么 KanjiOriginScreen: 可以放在 learnkanji.kv 而没有 < > 而程序仍然识别它应该使用它?

听起来你在问如何才能做到这一点..但我不明白为什么? 除非您希望它由 ScreenManager 管理?但是,在没有 <> 的 kv 文件中可以包含 KanjiOriginScreen 的唯一方法是它位于另一个根小部件中。例如,在我对您的其他问题 () 的回答中,请参阅 TestyScreenTwo,因为它们在 <Manager> 下的 kv 文件中。它们没有 <>,因为它们是 class 个实例,在另一个 class(管理器 class)中。在 kv 文件中,只有根小部件周围有 <>。如果 none 这对你有意义,你需要做一个关于 kivy 的教程。

查看 this tutorial 我前一段时间制作的,它解释了一些关于 kv 中的根小部件(大约 4.30)。

抱歉,我的问题不清楚,但在 IRC 上#Kivy 的帮助下,我得到了以下结果:

learnkanji.py

class LayoutFunctioning(BoxLayout):
    keyb_height = NumericProperty(260)

learnkanji.kv

KanjiOriginScreen:
    name: 'LearnKanji'
    fullscreen: True

    LayoutFunction:
        id: lfunc
        #...code...
        height: lfunc.keyb_height #Instead of root.keyb_height

现在我明白了如何使用id,我可以使用lfunc在LayoutFunction()中调用我的代码:)