2015-05-01 2 views
0

Я пытаюсь изменить этот пример: https://github.com/inclement/kivycrashcourse/blob/master/video14-using_a_screenmanager/after.py, чтобы он работал с .kv-файлом. Это мой myscreenmanager.py файл:Приложение Kivy с .kv-файлом не отображается

from kivy.app import App 
from kivy.base import runTouchApp 
from kivy.lang import Builder 
from kivy.properties import ListProperty 
from kivy.uix.boxlayout import BoxLayout 

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

import time 
import random 

class FirstScreen(Screen): 
    pass 

class SecondScreen(Screen): 
    pass 

class ColourScreen(Screen): 
    colour = ListProperty([1., 0., 0., 1.]) 

class MyScreenManager(ScreenManager): 
    def new_colour_screen(self): 
     name = str(time.time()) 
     s = ColourScreen(name=name, 
         colour=[random.random() for _ in range(3)] + [1]) 
     self.add_widget(s) 
     self.current = name 

class MyScreenManagerApp(App): 
    def build(self): 
     return MyScreenManager() 

if __name__ == "__main__": 
    MyScreenManagerApp().run() 

И это мой myscreenmanager.kv файл:

#:import FadeTransition kivy.uix.screenmanager.FadeTransition 
MyScreenManager: 
    transition: FadeTransition() 
    FirstScreen: 
    SecondScreen: 

<FirstScreen>: 
    name: 'first' 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      text: 'first screen!' 
      font_size: 30 
     BoxLayout: 
      Button: 
       text: 'goto second screen' 
       font_size: 30 
       on_release: app.root.current = 'second' 
      Button: 
       text: 'get random colour screen' 
       font_size: 30 
       on_release: app.root.new_colour_screen() 

<SecondScreen>: 
    name: 'second' 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      text: 'second screen!' 
      font_size: 30 
     BoxLayout: 
      Button: 
       text: 'goto first screen' 
       font_size: 30 
       on_release: app.root.current = 'first' 
      Button: 
       text: 'get random colour screen' 
       font_size: 30 
       on_release: app.root.new_colour_screen() 

<ColourScreen>: 
    BoxLayout: 
     orientation: 'vertical' 
     Label: 
      text: 'colour {:.2},{:.2},{:.2} screen'.format(*root.colour[:3]) 
      font_size: 30 
     Widget: 
      canvas: 
       Color: 
        rgba: root.colour 
       Ellipse: 
        pos: self.pos 
        size: self.size 
     BoxLayout: 
      Button: 
       text: 'goto first screen' 
       font_size: 30 
       on_release: app.root.current = 'first' 
      Button: 
       text: 'get random colour screen' 
       font_size: 30 
       on_release: app.root.new_colour_screen() 

После не запуска приложения ничего не отображается на экране. Ошибок в консоли нет. Переход к Builder.load_string отображает приложение, как ожидалось.

ответ

2

Найдено моя ошибка: при использовании .kv файла корневой виджет должен быть окружен <>, например:

#:import FadeTransition kivy.uix.screenmanager.FadeTransition 
<MyScreenManager>: 
    transition: FadeTransition() 
    FirstScreen: 
    SecondScreen: 

Не уверен, почему расхождение между load_string и .kv файлов, но это работает Теперь.

+2

это один из способов исправить это, другой - не строить build() (или возвращать результат супервызовов), поскольку по умолчанию будет использоваться корневой виджет загруженного kv. – Tshirtman