問(wèn)題描述
我沒(méi)有完全理解 python 文件中的類和 kivy 語(yǔ)言是如何交互的.我目前正在修改 Kivy 的 Showcase 示例以增加我的理解.
I'm not fully grasping how classes in a python file and the kivy language interact. I'm currently modifying the Showcase example of Kivy to increase my understanding.
- main.py
- showcase.kv
- data/screens/test.kv
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>
問(wèn)題
我想將我的代碼放在 Testy() 中,因?yàn)槲矣?jì)劃編寫(xiě)大量代碼來(lái)針對(duì)單個(gè)屏幕中發(fā)生的情況,我不想讓 ShowcaseScreen() 變得混亂,因?yàn)?ShowcaseScreen 也意味著用于其他屏幕.
Question
I want to have my code in Testy(), because I'm planning to write a lot of code aimed at what happens in that single screen and I don't want to clutter ShowcaseScreen(), because ShowcaseScreen is also meant for other screens.
為了澄清,在 test.kv 中我指的是變量 ttext.如果我沒(méi)有創(chuàng)建類 Testy() 我會(huì)這樣說(shuō):
To clarify, in test.kv I'm referring to the variable ttext. If I didn't make the class Testy() I would have put it as follows:
ShowcaseScreen:
name: 'LearnKanji'
fullscreen: True
BoxLayout:
text: root.ttext
然后在 main.py 我需要放
And then in main.py I would need to put
class ShowcaseScreen(Screen):
ttext = 'Bla'
但是,由于除了 Testy 之外的許多屏幕都使用 ShowcaseScreen() 類,因此將所有屏幕的所有代碼都放在這里會(huì)變得一團(tuán)糟.因此,我希望每個(gè)屏幕的代碼在一個(gè)單獨(dú)的類中.我認(rèn)為這對(duì)于更大的代碼項(xiàng)目來(lái)說(shuō)是一種更好的方式.
However since many screens besides Testy use the class ShowcaseScreen(), putting all the code for all screens in here would make it too much of a mess. Therefore I want the code per screen in a separate class. I think this is a better way for bigger code projects.
那么在test.kv文件中調(diào)用ShowcaseScreen:后怎么引用呢?這樣我就可以將用于 Testy 的代碼放在 Testy() 中,并使我的文件和類更有條理.
So how do I refer to after calling ShowcaseScreen: in the test.kv file? So that I can put the code meant for Testy in Testy() and keep my files and classes more organized.
推薦答案
您可以使用ScreenManager
.看看這里,我更改了您的一些代碼以提供使用 ScreenManager 將每個(gè)屏幕的代碼分離到它們自己的類中的示例.如果這有問(wèn)題,請(qǐng)告訴我.
You can use the ScreenManager
. Have a look here, I changed some of your code to provide an example of using the ScreenManager to seperate out the code for each screen into their own classes. If there are problems with this let me know.
ma??in.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
這篇關(guān)于.py 和 .kv 交互中的 Kivy 類的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!