为什么我的屏幕管理器不接受我的 .kv 文件中的所有屏幕?

Why isn't my Screen Manager accepting all of the screens from my .kv file?

我不明白为什么屏幕管理器没有占用我的两个屏幕,即使我简化了它。

通过 atom 使用 Python 3.6.1 和 kivy 1.11.1。 windows 机.

Disp.py

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

class OS(Screen):
    def __init__(s, **kwargs):
        super(OS, s).__init__(**kwargs)
        print('in OS class: ')
        print(s)
        print(s.manager)

class TS(Screen):
    def __init__(s, **kwargs):
        super(TS, s).__init__(**kwargs)
        print("In TS class: ")
        print(s)
        print(s.manager)

class SM(ScreenManager):
    def __init__(s, **kwargs):
        super(SM, s).__init__(**kwargs)
        s.add_widget(OS())
        s.add_widget(TS())
        print("in SM class: ")
        print(s)
        print(s.children)

class DispApp(App):
    def build(s):
        return SM()


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

和Disp.kv

<SM>:
    OS:
    TS:

<OS>:
    name: 'Open'

<TS>:
    name: 'Trials'

输出:

in OS class: 
<Screen name=''> 
None  
In TS class: 
<Screen name=''> 
None 
in OS class: 
<Screen name='Open'> 
None 
In TS class: 
<Screen name='Trials'> 
None 
in SM class: 
<__main__.SM object at 0x10F911F0> 
[<Screen name='Open'>]

答:一旦初始化,TS 和 OS 屏幕就会采用 .kv 文件中的名称,但它们没有管理器。

B:为什么屏幕管理器只有一个child?

C: 我只想在打开屏幕上打开一个文件 (class OS) 然后当它打开时,将文件 运行 放在试用屏幕上 (classTS)。我想这个项目现在应该已经完成​​了,除非我似乎无法进入屏幕管理器来引用另一个 class。 (而且我真的应该能够仅凭我的一般 kivy 知识来实现​​屏幕管理器)

有几个概念需要弄清楚。首先从 ScreenManager class 访问屏幕的问题。 ScreenManager 将始终将当前屏幕作为其子屏幕。要从 ScreenManager class 访问不同的屏幕,您可以使用 screens 属性 它将 return 屏幕 class 作为列表,然后您可以通过它们进行枚举以访问任何单独的屏幕。您还可以使用 ScreenManagerget_screen(<name>) 功能按名称访问特定屏幕。

第二个问题是从 class 中访问屏幕信息(如名称、经理等)。当您尝试在屏幕的 __init__ 方法中访问这些信息时,请记住屏幕的初始化尚未完成。因此,您得到空白和 None 回复。如果您添加 Clock 的延迟,那么您会看到信息将 return 正确编辑。

这两个问题都在修改后的 Disp.py 文件中得到解决和演示。请运行,您可以理解上面解释的概念:

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

class OS(Screen):
    def __init__(s, **kwargs):
        super(OS, s).__init__(**kwargs)
        Clock.schedule_once(lambda dt: s.info())
        
    def info(s):
        print('in OS class: ')
        print(s)
        print(s.manager)        

class TS(Screen):
    def __init__(s, **kwargs):
        super(TS, s).__init__(**kwargs)
        Clock.schedule_once(lambda dt: s.info())        

    def info(s):
        print('in OS class: ')
        print(s)
        print(s.manager)        

class SM(ScreenManager):
    def __init__(s, **kwargs):
        super(SM, s).__init__(**kwargs)
        print("From SM class: ")
        print(s.screens)
        print(s.screens[0])
        print(s.screens[1])
        print(s.get_screen('Open'))
        print(s.get_screen('Trials'))

class DispApp(App):
    def build(s):
        return SM()


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