Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 2.7 调用在kivy'中不起作用的变量;s-kv语言_Python 2.7_Kivy_Kivy Language - Fatal编程技术网

Python 2.7 调用在kivy'中不起作用的变量;s-kv语言

Python 2.7 调用在kivy'中不起作用的变量;s-kv语言,python-2.7,kivy,kivy-language,Python 2.7,Kivy,Kivy Language,我的问题是,在一个屏幕上设置变量后,如何在另一个屏幕上调用它 以下是我尝试执行的代码: main.py import kivy kivy.require('1.10.0') from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager class Manager(ScreenManager): pass class FirstScreen(Screen): pass cla

我的问题是,在一个屏幕上设置变量后,如何在另一个屏幕上调用它

以下是我尝试执行的代码:

main.py

import kivy
kivy.require('1.10.0')
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager

class Manager(ScreenManager):
    pass

class FirstScreen(Screen):
    pass

class SecondScreen(Screen):
    pass

class ExampleApp(App):
    def build(self):
        return Manager()

if __name__ == '__main__':
    ExampleApp().run()
例1.kv

#: import sm kivy.uix.screenmanager
#: set Question 'not working'

<Manager>
    transition: sm.FadeTransition()
    FirstScreen:
    SecondScreen:

<FirstScreen>
    BoxLayout:
        TextInput:
            id: txt
            multiline: False
        Button:
            text: 'Press Me'
            on_release:
                Question = txt.text
                app.root.current = 'Next'

<SecondScreen>
    name: 'Next'
    Label:
        text: Question
#:导入sm kivy.uix.screenmanager
#:设置问题“不工作”
转换:sm.FadeTransition()
第一屏:
第二屏:
盒子布局:
文本输入:
id:txt
多行:False
按钮:
文字:“按我”
发布时:
问题=txt.text
app.root.current='Next'
姓名:“下一个”
标签:
正文:问题


当这个运行时,一切都正常工作。只有一个例外。SecondScreen上的标签显示“不工作”,而它应该读取我在FirstScreen上输入的文本。为什么我不能完成此任务?

您必须提供id标记,并使用ids方法或ObjectProperty引用变量。有关详细信息,请参考下面的两个示例

示例1-使用ids方法 id是小部件的一个弱点

main.py 例1.kv objectproperty.kv
#:kivy 1.10.0
#:导入FadeTransition kivy.uix.screenmanager.FadeTransition
#:设置问题“不工作”
第二屏幕:第二屏幕
转换:FadeTransition()
第一屏:
第二屏:
id:第二个屏幕
盒子布局:
文本输入:
id:txt
文字:“工作!”
多行:False
按钮:
文字:“按我”
发布时:
root.manager.second_screen.label.text=txt.text
app.root.current='Next'
姓名:“下一个”
标签:标签
标签:
id:标签
正文:问题
输出-使用ObjectProperty

非常好用,谢谢你,我甚至没有想到id,因为它们很脆弱,很容易被忽视。你是对的,id就是脆弱。使用ObjectProperty的“最佳实践”。这将创建一个直接引用,提供更快的访问,并且更加明确。我添加了另一个使用ObjectProperty的示例。详情请参阅。
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager


class Manager(ScreenManager):
    pass


class FirstScreen(Screen):
    pass


class SecondScreen(Screen):
    pass


class ExampleApp(App):
    def build(self):
        return Manager()


if __name__ == '__main__':
    ExampleApp().run()
#:kivy 1.10.0
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
#: set Question 'not working'

<Manager>
    transition: FadeTransition()
    FirstScreen:
    SecondScreen:
        id: second_screen

<FirstScreen>
    BoxLayout:
        TextInput:
            id: txt
            text: "Working!"
            multiline: False
        Button:
            text: 'Press Me'
            on_release:
                root.manager.ids.second_screen.ids.label.text = txt.text
                app.root.current = 'Next'

<SecondScreen>
    name: 'Next'
    Label:
        id: label
        text: Question
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import ObjectProperty


class Manager(ScreenManager):
    second_screen = ObjectProperty()


class FirstScreen(Screen):
    pass


class SecondScreen(Screen):
    label = ObjectProperty()


class ObjectPropertyApp(App):
    def build(self):
        return Manager()


if __name__ == '__main__':
    ObjectPropertyApp().run()
#:kivy 1.10.0
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
#: set Question 'not working'

<Manager>
    second_screen: second_screen
    transition: FadeTransition()
    FirstScreen:
    SecondScreen:
        id: second_screen

<FirstScreen>
    BoxLayout:
        TextInput:
            id: txt
            text: "Working!"
            multiline: False
        Button:
            text: 'Press Me'
            on_release:
                root.manager.second_screen.label.text = txt.text
                app.root.current = 'Next'

<SecondScreen>
    name: 'Next'
    label: label
    Label:
        id: label
        text: Question