kivy没有名称为“main_screen”的屏幕

时间:2018-05-31 03:35:07

标签: python kivy kivy-language

好吧,我正在尝试使用ScreenManager,我的名字出了问题。 我的应用程序应该以HelloScreen开头,3秒后它将自动转移到MainScreen。

这些在我的main.py中:

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


class MainScreen(Screen):
    pass


class HelloScreen(Screen):
    pass


class MemoryManagementSystem(ScreenManager):
    def __init__(self, **kwargs):
        super(MemoryManagementSystem, self).__init__(**kwargs)
        Clock.schedule_once(self.transit_scene, 3)

    def transit_scene(self, *args):
        self.current = "main_screen"


class MemoryManagementSystemApp(App):
    def build(self):
        return MemoryManagementSystem()


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

这些在我的kv文件中:

#:import FadeTransition kivy.uix.screenmanager.FadeTransition

MemoryManagementSystem:
    transition: FadeTransition()
    HelloScreen:
        name: "hello_screen"
    MainScreen:
        name: "main_screen"

<HelloScreen>:
    BoxLayout:
        Label:
            text: "Project"
            font_size: 50

<MainScreen>:

如果我运行这些,屏幕是全黑的,没有显示标签,3秒后应用程序崩溃,我得到了这个:

File "C:\Users\98742\Anaconda3\lib\site-packages\kivy\uix\screenmanager.py", line 1037, in on_current
     screen = self.get_screen(value)
   File "C:\Users\98742\Anaconda3\lib\site-packages\kivy\uix\screenmanager.py", line 1063, in get_screen
     raise ScreenManagerException('No Screen with name "%s".' % name)
 kivy.uix.screenmanager.ScreenManagerException: No Screen with name "main_screen".

但是我已经在.kv文件中添加了一个名为“main_screen”的屏幕......我只是不明白它。

我读了其他问题,发现我可以通过在main.py中添加屏幕来解决这个问题,如下所示:

class MemoryManagementSystem(ScreenManager):
    def __init__(self, **kwargs):
        super(MemoryManagementSystem, self).__init__(**kwargs)
        self.add_widget(HelloScreen(name='hello_screen'))
        self.add_widget(MainScreen(name="main_screen"))
        Clock.schedule_once(self.transit_scene, 3)

    def transit_scene(self, *args):
        self.current = "main_screen"

它确实有效。但我只是不知道为什么我的版本不能工作?(它没有显示标签,它崩溃了)。它与init和.kv文件有什么关系吗?

感谢您的任何解释。

2 个答案:

答案 0 :(得分:0)

如果你不想使用Builder.load_file('path/to/file.kv')根,那么会发生什么?如果你想加载.kv,它必须与以小写方式从App继承的类同名,如文档所示:

  

如何加载KV

     

有两种方法可以将Kv代码加载到您的应用程序中:

     
      
  • 按名称惯例:
  •   
     

Kivy会查找与您的App类同名的Kv文件   小写,减去“App”,如果它以'App'结尾,例如:

     

MyApp - &gt; my.kv如果此文件定义了Root Widget,它将被附加   到App的root属性并用作应用程序的基础   小部件树。

     
      
  • 构建器:您可以告诉Kivy直接加载字符串或文件。如果   这个字符串或文件定义了一个根小部件,它将由它返回   方法:
  •   
     

Builder.load_string(kv_string)

     

或:

     

#:import FadeTransition kivy.uix.screenmanager.FadeTransition MemoryManagementSystem: transition: FadeTransition() HelloScreen: name: "hello_screen" MainScreen: name: "main_screen" <HelloScreen>: BoxLayout: Label: text: "Project" font_size: 50 <MainScreen>:

在你的情况下,它应该被称为memorymanagementsystem.kv,另外你不应该返回覆盖构建方法。

<强> memorymanagementsystem.kv

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


class MainScreen(Screen):
    pass

class HelloScreen(Screen):
    pass

class MemoryManagementSystem(ScreenManager):
    def __init__(self, **kwargs):
        super(MemoryManagementSystem, self).__init__(**kwargs)
        Clock.schedule_once(self.transit_scene, 3)
    def transit_scene(self, *args):
        self.current = "main_screen"

class MemoryManagementSystemApp(App):
    pass


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

<强> main.py

MemoryManagementSystem:

另一个解决方案是,如果你想使用覆盖方法构建返回一个新的方法,你必须在.kv中做到这一点,没有root,所以你必须将<MemoryManagementSystem>:更改为#:import FadeTransition kivy.uix.screenmanager.FadeTransition <MemoryManagementSystem>: transition: FadeTransition() HelloScreen: name: "hello_screen" MainScreen: name: "main_screen" <HelloScreen>: BoxLayout: Label: text: "Project" font_size: 50 <MainScreen>: ,因为我显示如下:

<强> memorymanagementsystem.kv

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

class MainScreen(Screen):
    pass

class HelloScreen(Screen):
    pass

class MemoryManagementSystem(ScreenManager):
    def __init__(self, **kwargs):
        super(MemoryManagementSystem, self).__init__(**kwargs)
        Clock.schedule_once(self.transit_scene, 3)
    def transit_scene(self, *args):
        self.current = "main_screen"

class MemoryManagementSystemApp(App):
    def build(self):
        return MemoryManagementSystem()

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

<强> main.py:

{{1}}

参考文献:

答案 1 :(得分:0)

黑/空白屏幕 - 两个根小部件

您遇到了黑屏/空白屏幕,因为您的Kivy App中有两个根小部件。其中一个来自main.py,即返回MemoryManagementSystem()。第二个根来自kv文件,即 MemoryManagementSystem: ,此声明称为 根规则

应用程序使用的根小部件是来自main.py的根小部件,即return MemoryManagementSystem(),导致黑屏/黑屏。

Programming Guide » Kv language » Rule context

  

通过声明根小部件的类来声明根规则,   没有任何缩进,后跟:并将被设置为根   App实例的属性:

     

小部件:
一个类规则,由一个小部件类的名称在&lt;之间声明。   &GT;然后是:,定义如何以图形方式表示该类的任何实例:

     

&LT;进myWidget&GT;:

问题

Kivy应用程序缺少kv文件中的 类规则 声明,以便连接到main.py中定义的类

解决方案

kv文件

替换

MemoryManagementSystem:

<MemoryManagementSystem>:

输出

Img01 - App Startup Img02 - Main Screen