Python 当我将正确的.kv代码放入外部的.kv文件时,为什么使用screenmanager的.kv代码不起作用?
完美功能代码:Python 当我将正确的.kv代码放入外部的.kv文件时,为什么使用screenmanager的.kv代码不起作用?,python,kivy,Python,Kivy,完美功能代码: from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition Builder.load_string(""" #:kivy 1.8 <StartScreen>: BoxLayout: Label: text: "Press Bu
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
Builder.load_string("""
#:kivy 1.8
<StartScreen>:
BoxLayout:
Label:
text: "Press Button to"
Button:
text: "Start Server"
on_press:
root.start_server()
root.manager.current='stopscreen'
<StopScreen>:
BoxLayout:
Label:
text: "Press Button to"
Button:
text: "Stop Server"
on_press:
root.stop_server()
root.manager.current='startscreen'
""")
class StartScreen(Screen):
def start_server(self):
print('Server started.')
class StopScreen(Screen):
def stop_server(self):
print('Server stopped.')
sm = ScreenManager(transition=NoTransition())
sm.add_widget(StartScreen(name='startscreen'))
sm.add_widget(StopScreen(name='stopscreen'))
class MySpecialApp(App):
def build(self):
return sm
MySpecialApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager、Screen、NotTransition
生成器。加载\u字符串(“”)
#:kivy 1.8
:
盒子布局:
标签:
文本:“按下按钮以”
按钮:
文本:“启动服务器”
新闻界:
root.start_服务器()
root.manager.current='stopscreen'
:
盒子布局:
标签:
文本:“按下按钮以”
按钮:
文本:“停止服务器”
新闻界:
root.stop_服务器()
root.manager.current='startscreen'
""")
类开始屏幕(屏幕):
def启动_服务器(自身):
打印('服务器已启动')
类停止屏幕(屏幕):
def stop_服务器(自身):
打印('服务器已停止')
sm=ScreenManager(transition=nottransition())
sm.add_小部件(StartScreen(name='StartScreen'))
sm.add_小部件(StopScreen(name='StopScreen'))
类别MySpecialApp(应用程序):
def生成(自):
返回sm
MySpecialApp().run())
现在,根据Kivy文档,应该可以将代码开头加载的字符串放入外部文件myspecial.kv中
一旦我这样做,我的屏幕就空白了,没有按钮,没有文本。为什么会这样?我如何才能让它工作?当应用程序启动时,会加载
myspecial.kv
文件,但在此之前您需要初始化您的小部件。在运行sm=ScreenManager(transition=nottransition())
时,kv尚未加载,因此ScreenManager没有预期的样式
您应该在
build
方法中创建小部件。kv文件在该方法运行之前加载,因此一切正常。应用程序启动时会加载myspecial.kv
文件,但在此之前您需要初始化小部件。在运行sm=ScreenManager(transition=nottransition())
时,kv尚未加载,因此ScreenManager没有预期的样式
您应该在
build
方法中创建小部件。在运行此方法之前加载了kv文件,因此一切都应该正常运行。main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
class StartScreen(Screen):
def start_server(self):
print('Server started.')
class StopScreen(Screen):
def stop_server(self):
print('Server stopped.')
class RootScreen(ScreenManager):
pass
class MySpecialApp(App):
def build(self):
return RootScreen()
if __name__ == '__main__':
MySpecialApp().run()
myspecial.kv
<RootScreen>:
StartScreen:
StopScreen:
<StartScreen>:
BoxLayout:
Label:
text: "Press Button to"
Button:
text: "Start Server"
on_press:
root.start_server()
root.manager.current='stopscreen'
<StopScreen>:
BoxLayout:
Label:
text: "Press Button to"
Button:
text: "Stop Server"
on_press:
root.stop_server()
root.manager.current='startscreen'
:
StartScreen:
停止屏幕:
:
盒子布局:
标签:
文本:“按下按钮以”
按钮:
文本:“启动服务器”
新闻界:
root.start_服务器()
root.manager.current='stopscreen'
:
盒子布局:
标签:
文本:“按下按钮以”
按钮:
文本:“停止服务器”
新闻界:
root.stop_服务器()
root.manager.current='startscreen'
main.py
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
class StartScreen(Screen):
def start_server(self):
print('Server started.')
class StopScreen(Screen):
def stop_server(self):
print('Server stopped.')
class RootScreen(ScreenManager):
pass
class MySpecialApp(App):
def build(self):
return RootScreen()
if __name__ == '__main__':
MySpecialApp().run()
myspecial.kv
<RootScreen>:
StartScreen:
StopScreen:
<StartScreen>:
BoxLayout:
Label:
text: "Press Button to"
Button:
text: "Start Server"
on_press:
root.start_server()
root.manager.current='stopscreen'
<StopScreen>:
BoxLayout:
Label:
text: "Press Button to"
Button:
text: "Stop Server"
on_press:
root.stop_server()
root.manager.current='startscreen'
:
StartScreen:
停止屏幕:
:
盒子布局:
标签:
文本:“按下按钮以”
按钮:
文本:“启动服务器”
新闻界:
root.start_服务器()
root.manager.current='stopscreen'
:
盒子布局:
标签:
文本:“按下按钮以”
按钮:
文本:“停止服务器”
新闻界:
root.stop_服务器()
root.manager.current='startscreen'