Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当我将正确的.kv代码放入外部的.kv文件时,为什么使用screenmanager的.kv代码不起作用?_Python_Kivy - Fatal编程技术网

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'