【问题标题】:Why isn't my Screen Manager accepting all of the screens from my .kv file?为什么我的屏幕管理器不接受 .kv 文件中的所有屏幕?
【发布时间】:2021-01-10 07:22:24
【问题描述】:

我无法弄清楚为什么屏幕管理器没有占用我的两个屏幕,即使我对其进行了简化。

通过 atom 使用 Python 3.6.1 和 kivy 1.11.1。窗户机。

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:为什么屏幕管理器只有一个孩子?

C:我只想在 Open Screen(OS 类)上打开一个文件,然后当它打开时,让该文件在 Trials Screen(TS 类)上运行。我认为该项目现在已经完成,除非我似乎无法进入屏幕管理器来引用其他类。 (而且我真的应该能够仅根据我的一般知识来实现​​屏幕管理器)

【问题讨论】:

    标签: python user-interface kivy screen


    【解决方案1】:

    有几个概念需要明确。首先从ScreenManager 类访问屏幕的问题。 ScreenManager 将始终将当前屏幕作为子屏幕。要从ScreenManager 类访问不同的屏幕,您可以使用screens 属性,它将屏幕类作为列表返回,然后您可以枚举它们以访问任何单独的屏幕。您还可以使用get_screen(&lt;name&gt;)ScreenManager 函数通过其名称访问特定屏幕。

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

    这两个问题都在修改后的 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()
    

    【讨论】:

    • 这说明了一切!非常感谢您的澄清!我真的觉得我掌握了一些我不正确的想法。再次感谢。
    猜你喜欢
    • 2022-11-13
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多