功能完善的代码:

from kivy.app import App
from kivy.lang import Builder

from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition

Builder.load_string("""
#:kivy 1.8

<StartScreen>:
    BoxLayout:
        Label:
            text: "Press Button to"
        Button:
            text: "Start Server"
            on_press:
                root.start_server()
                root.manager.current='stopscreen'

<StopScreen>:
    BoxLayout:
        Label:
            text: "Press Button to"
        Button:
            text: "Stop Server"
            on_press:
                root.stop_server()
                root.manager.current='startscreen'
""")

class StartScreen(Screen):
    def start_server(self):
        print('Server started.')


class StopScreen(Screen):
    def stop_server(self):
        print('Server stopped.')


sm = ScreenManager(transition=NoTransition())
sm.add_widget(StartScreen(name='startscreen'))
sm.add_widget(StopScreen(name='stopscreen'))


class MySpecialApp(App):

    def build(self):
        return sm


MySpecialApp().run()


现在,根据Kivy Docs的说法,应该可以将在此代码开头加载的字符串放入外部文件myspecial.kv中。
一旦这样做,我的屏幕就会一片空白,没有按钮,没有文本。为什么会这样,我如何才能使它正常工作?

最佳答案

启动应用程序时会加载myspecial.kv文件,但是在此之前您需要初始化小部件。在运行sm = ScreenManager(transition=NoTransition())时,尚未加载kv,因此ScreenManager没有预期的样式。

您应该改为在build方法中创建窗口小部件。在运行此方法之前,会先加载kv文件,因此一切正常。

关于python - 当我将它放在外部.kv文件中时,为什么使用screenmanager使用的正确.kv代码不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22899815/

10-12 21:26