2014-04-06 29 views
1

完美的功能代碼:爲什麼正確的.kv代碼使用screenmanager不工作時,我把它放在一個外部.kv文件?

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文檔,應該可以把這段代碼的開始加載的字符串,只要我做的到外部文件,myspecial.kv 我的屏幕留空,沒有按鈕,沒有文字。爲什麼是這樣,我如何才能使這個工作?

回答

6

當應用程序啓動時加載myspecial.kv文件,但您在此之前初始化您的小部件。在運行sm = ScreenManager(transition=NoTransition())時,kv尚未加載,因此ScreenManager沒有預期的樣式。

您應該在build方法中創建您的小部件。在運行該方法之前加載kv文件,所以一切都應該正常。

0

main.py

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 


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


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


class RootScreen(ScreenManager): 
    pass 


class MySpecialApp(App): 
    def build(self): 
     return RootScreen() 


if __name__ == '__main__': 
    MySpecialApp().run() 

myspecial.kv

<RootScreen>: 
    StartScreen: 
    StopScreen: 


<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' 
相關問題