所以我只是使用一些示例 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'
不幸的是,当我现在运行代码时,我只是得到一个黑屏。谁能告诉我出了什么问题吗?谢谢!
最佳答案
该代码在 python 文件的主体中创建屏幕管理器 (sm
)。当从文件加载 kv 时,这只在稍后发生,因此没有任何 kv 规则应用于 sm
。之前还好,因为load_string发生在实例化之前。
因此,以这种方式实例化小部件是不好的做法,并且 sm = ScreenManager(...
等应移至 build 方法。这是在加载 kv 文件后运行的,所以一切都应该有效。
关于python - .kv 文件似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31464155/