.py 和 .kv 交互中的 Kivy class
Kivy class in .py and .kv interaction
我没有完全理解 python 文件中的 classes 和 kivy 语言如何交互。我目前正在修改Kivy的Showcase示例,以增加我的理解。
文件结构
- main.py
- showcase.kv
- data/screens/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 中,我指的是变量文本。如果我没有制作 class Testy() 我会把它写成这样:
ShowcaseScreen:
name: 'LearnKanji'
fullscreen: True
BoxLayout:
text: root.ttext
然后在 main.py 中我需要输入
class ShowcaseScreen(Screen):
ttext = 'Bla'
然而,由于除 Testy 之外的许多屏幕都使用 class ShowcaseScreen(),因此将所有屏幕的所有代码都放在这里会使它变得太乱。因此,我希望每个屏幕的代码单独 class。我认为这对于更大的代码项目来说是更好的方法。
那么在test.kv文件中调用ShowcaseScreen:之后如何引用呢?这样我就可以将用于 Testy 的代码放入 Testy() 并使我的文件和 class 更有条理。
跟进问题:
可以使用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
我没有完全理解 python 文件中的 classes 和 kivy 语言如何交互。我目前正在修改Kivy的Showcase示例,以增加我的理解。
文件结构
- main.py
- showcase.kv
- data/screens/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 中,我指的是变量文本。如果我没有制作 class Testy() 我会把它写成这样:
ShowcaseScreen:
name: 'LearnKanji'
fullscreen: True
BoxLayout:
text: root.ttext
然后在 main.py 中我需要输入
class ShowcaseScreen(Screen):
ttext = 'Bla'
然而,由于除 Testy 之外的许多屏幕都使用 class ShowcaseScreen(),因此将所有屏幕的所有代码都放在这里会使它变得太乱。因此,我希望每个屏幕的代码单独 class。我认为这对于更大的代码项目来说是更好的方法。
那么在test.kv文件中调用ShowcaseScreen:之后如何引用呢?这样我就可以将用于 Testy 的代码放入 Testy() 并使我的文件和 class 更有条理。
跟进问题:
可以使用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