好吧,我正在尝试使用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文件有什么关系吗?
感谢您的任何解释。
答案 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中定义的类
替换
MemoryManagementSystem:
与
<MemoryManagementSystem>: