为什么我的屏幕管理器不接受我的 .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 作为列表,然后您可以通过它们进行枚举以访问任何单独的屏幕。您还可以使用 ScreenManager
的 get_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()
我不明白为什么屏幕管理器没有占用我的两个屏幕,即使我简化了它。
通过 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 作为列表,然后您可以通过它们进行枚举以访问任何单独的屏幕。您还可以使用 ScreenManager
的 get_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()