Kivy ScreenManager:应用在尝试添加第二个 Window 后停止 运行
Kivy ScreenManager: App stopped running after trying to add 2nd Window
我正在为我的论文构建一个应用程序,到目前为止它只使用一个 window 就运行良好。现在我正在尝试添加其他 windows 例如指示。我正在关注屏幕管理器的文档和应用程序的一些示例,并尝试添加我的第二个 window 。但不知何故,它无法在我的 kv.file 中识别 ScreenManager class。也许你可以帮忙,我不确定我错过了什么。
主程序:Peenomat.py
import kivy
# -*- coding: iso-8859-1 -*-
from kivy.app import App
from kivy.uix.button import Label
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
from kivy.core.text import LabelBase
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty
from kivy.properties import ObjectProperty
#additional .kv files used to speciffy layout and functions of peenomat.kv
Builder.load_file('Header.kv')
Builder.load_file('Statusbar.kv')
Builder.load_file('Inputparameters.kv')
Builder.load_file('Outputparameters.kv')
pm = Builder.load_file('peenomat.kv')
#Layout
"""
class Peenomat(AnchorLayout):
pass
"""
class Peenomat(Screen):
pass
class Instruction(Screen):
pass
class WindowManager(ScreenManager):
pass
#App
class PeenomatApp(App):
def build(self):
return pm
if __name__=="__main__":
PeenomatApp().run()
和最小化的 .kv 文件
peenomat.kv:
WindowManager:
Peenomat:
Instruction:
<Peenomat>
name: "peenomat"
AnchorLayout:
anchor_x: 'left'
anchor_y: 'bottom'
GridLayout:
cols: 1
Header:
id:
size_hint:
InputParameters:
id:
size_hint:
StatusBar:
id:
size_hint:
OutputParameters:
id:_
size_hint:
<Instruction>:
name: "instruction"
Button:
text: "Verstanden!"
on_release:
app.root.current = "main"
root.manager.transition.direction = "right"
所以就像我说的,应用程序在添加屏幕和屏幕管理器之前工作 classes 并且我收到错误:
Traceback (most recent call last):
File "C:/Users/schum/Dokumente/TUD/Masterthesis/Peenomat.py", line 21, in <module>
pm = Builder.load_file('peenomat.kv')
File "C:\Users\schum\Dokumente\TUD\Masterthesis\venv\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
return self.load_string(data, **kwargs)
File "C:\Users\schum\Dokumente\TUD\Masterthesis\venv\lib\site-packages\kivy\lang\builder.py", line 399, in load_string
widget = Factory.get(parser.root.name)(__no_builder=True)
File "C:\Users\schum\Dokumente\TUD\Masterthesis\venv\lib\site-packages\kivy\factory.py", line 131, in __getattr__
raise FactoryException('Unknown class <%s>' % name)
kivy.factory.FactoryException: Unknown class <WindowManager>
尽管他们有相同的名字。希望你能帮帮我!
所以我找到了一个解决方案,使用py文件中的ScreenManager实现。我用 class WindowManager(ScreenManager)
class:
切换了这个
sm = ScreenManager()
sm.add_widget(Peenomat(name='peenomat'))
sm.add_widget(Instruction(name='instruction'))
因此添加到我的构建器中:
class PeenomatApp(App):
def build(self):
return sm
我从 kv.file 中完全删除了带有 WindowManager class 的 3 行。现在它工作得很好
我正在为我的论文构建一个应用程序,到目前为止它只使用一个 window 就运行良好。现在我正在尝试添加其他 windows 例如指示。我正在关注屏幕管理器的文档和应用程序的一些示例,并尝试添加我的第二个 window 。但不知何故,它无法在我的 kv.file 中识别 ScreenManager class。也许你可以帮忙,我不确定我错过了什么。
主程序:Peenomat.py
import kivy
# -*- coding: iso-8859-1 -*-
from kivy.app import App
from kivy.uix.button import Label
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
from kivy.core.text import LabelBase
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import BooleanProperty
from kivy.properties import ObjectProperty
#additional .kv files used to speciffy layout and functions of peenomat.kv
Builder.load_file('Header.kv')
Builder.load_file('Statusbar.kv')
Builder.load_file('Inputparameters.kv')
Builder.load_file('Outputparameters.kv')
pm = Builder.load_file('peenomat.kv')
#Layout
"""
class Peenomat(AnchorLayout):
pass
"""
class Peenomat(Screen):
pass
class Instruction(Screen):
pass
class WindowManager(ScreenManager):
pass
#App
class PeenomatApp(App):
def build(self):
return pm
if __name__=="__main__":
PeenomatApp().run()
和最小化的 .kv 文件 peenomat.kv:
WindowManager:
Peenomat:
Instruction:
<Peenomat>
name: "peenomat"
AnchorLayout:
anchor_x: 'left'
anchor_y: 'bottom'
GridLayout:
cols: 1
Header:
id:
size_hint:
InputParameters:
id:
size_hint:
StatusBar:
id:
size_hint:
OutputParameters:
id:_
size_hint:
<Instruction>:
name: "instruction"
Button:
text: "Verstanden!"
on_release:
app.root.current = "main"
root.manager.transition.direction = "right"
所以就像我说的,应用程序在添加屏幕和屏幕管理器之前工作 classes 并且我收到错误:
Traceback (most recent call last):
File "C:/Users/schum/Dokumente/TUD/Masterthesis/Peenomat.py", line 21, in <module>
pm = Builder.load_file('peenomat.kv')
File "C:\Users\schum\Dokumente\TUD\Masterthesis\venv\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
return self.load_string(data, **kwargs)
File "C:\Users\schum\Dokumente\TUD\Masterthesis\venv\lib\site-packages\kivy\lang\builder.py", line 399, in load_string
widget = Factory.get(parser.root.name)(__no_builder=True)
File "C:\Users\schum\Dokumente\TUD\Masterthesis\venv\lib\site-packages\kivy\factory.py", line 131, in __getattr__
raise FactoryException('Unknown class <%s>' % name)
kivy.factory.FactoryException: Unknown class <WindowManager>
尽管他们有相同的名字。希望你能帮帮我!
所以我找到了一个解决方案,使用py文件中的ScreenManager实现。我用 class WindowManager(ScreenManager)
class:
sm = ScreenManager()
sm.add_widget(Peenomat(name='peenomat'))
sm.add_widget(Instruction(name='instruction'))
因此添加到我的构建器中:
class PeenomatApp(App):
def build(self):
return sm
我从 kv.file 中完全删除了带有 WindowManager class 的 3 行。现在它工作得很好