所以我只是使用一些示例Kivy文件代码,我遇到了这个允许用户在屏幕之间切换的代码:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
Builder.load_string("""
<MenuScreen>:
BoxLayout:
Button:
text: 'Build Scenario'
on_press: root.manager.current = 'settings'
Button:
text: 'Run Existing Scenerio'
<SettingsScreen>:
BoxLayout:
Button:
text: 'Run Existing Scenerio'
Button:
text: 'Back to menu'
on_press: root.manager.current = 'menu'
""")
# Declare both screens
class MenuScreen(Screen):
pass
class SettingsScreen(Screen):
pass
# Create the screen manager
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(SettingsScreen(name='settings'))
class TestApp(App):
def build(self):
return sm
if __name__ == '__main__':
TestApp().run()
我想知道是否可以将Builder.load_string()方法中给出的代码放入单独的.kv文件中。所以我做到了。我评论了Builder部分(我承认我不知道它的作用是什么)并将字符串复制到.kv文件中,如下所示:
# the file name is test.kv
#:kivy 1.0.9
<MenuScreen>:
BoxLayout:
Button:
text: 'Build Scenario'
on_press: root.manager.current = 'settings'
Button:
text: 'Run Existing Scenerio'
<SettingsScreen>:
BoxLayout:
Button:
text: 'Run Existing Scenerio'
Button:
text: 'Back to menu'
on_press: root.manager.current = 'menu'
不幸的是,当我现在运行代码时,我只是得到一个黑屏。谁能告诉我什么错了?谢谢!
答案 0 :(得分:3)
代码在python文件的主体中创建了screenmanager(sm
)。当从文件加载kv时,这仅在稍后发生,因此没有kv规则应用于sm
。之前没关系,因为load_string在实例化之前就已经发生了。
出于这个原因,以这种方式实例化小部件是不好的做法,sm = ScreenManager(...
等应该移动到构建方法。这是在加载kv文件后运行的,所以一切都应该有效。