.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
回答您的问题:
您的操作方式应该可行。您应该能够从 kv 访问对象属性。但是,如果您的属性将要更改,并且您希望 UI 在更改时更新,您应该使用 Kivy Properties。如果它是常量,则正常属性可以正常工作。
从 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
的唯一方法是它位于另一个根小部件中。例如,在我对您的其他问题 () 的回答中,请参阅 Testy
和 ScreenTwo
,因为它们在 <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()中调用我的代码:)
跟进
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
回答您的问题:
您的操作方式应该可行。您应该能够从 kv 访问对象属性。但是,如果您的属性将要更改,并且您希望 UI 在更改时更新,您应该使用 Kivy Properties。如果它是常量,则正常属性可以正常工作。
从 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
的唯一方法是它位于另一个根小部件中。例如,在我对您的其他问题 (Testy
和 ScreenTwo
,因为它们在 <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()中调用我的代码:)