将参数传递给其他媒体资源

时间:2018-09-09 15:52:42

标签: python kivy

我有两个屏幕。 在Box上,我有一个带有名称的按钮。当我单击按钮时,我想将屏幕切换到ChangeText,在那里看到名称。单击按钮后,Box.name的文本应为TextInput-text。 我找不到解决方法。

kv文件

<ChangeText>:
    BoxLayout:
        TextInput:
            id: txt
            multiline: False
            text: Box.name
        Button:
            text: "Save"
            on_release: Box.name = txt.text

<Box>:
    BoxLayout:
        Button:
            text: root.name
            on_press: root.change_text(root.name)

py文件

class ChangeText(Screen):
    pass

class Box(Screen):
    name = StringProperty("sometext")

    def change_text(label):
        sm.current = 'changetext'
        ### ?!?!? ###

2 个答案:

答案 0 :(得分:0)

因此,我找到了一种解决方法,该方法可能不稳定,但现在可以使用。 花了我几个小时。

我刚刚将eveyr属性声明为全局变量。然后,我编写了一个全局导出函数,该函数覆盖了所有全局变量。因此,每当切换屏幕时,我都会执行export(props)。现在,我上一个视图中的所有属性都已导出。我需要更新每个屏幕的所有属性。因此,每个屏幕都有update()。通过for循环将Export()扩展到所有屏幕,并调用update()。

home_name = ''

def export(hn):
    home_name = hn
    for screen in sm.screens:
        screen.update()

class Team(BoxLayout):
    home_name = StringProperty()

    def update(self):
        global home_name
        self.home_name = home_name 


class Box(BoxLayout):
    home_name = StringProperty("Home")

    def load_team(self):
        export(self.home_name)
        sm.current = 'team'

    def update(self):
        global home_name
        self.home_name = home_name 
        #further screen specific actions

kv

<Team>:
    id: team
    TextInput:
        id: team_name
        text: root.home_name
        multiline: False
    Button:
        text: "Save"
        on_press: root.save(team_name.text)

<Box>:
     Button:
         id: btn_home_name
         text: root.home_name
         on_press: root.load_team()

答案 1 :(得分:0)

问题-属性,名称

使用Kivy ScreenManager时,请勿声明名为 name 的变量/属性,因为它是用于命名/识别屏幕的保留字。

ScreenManager » name

name
     

在ScreenManager中必须唯一的屏幕名称。这个   是ScreenManager.current的名称。

     

name是StringProperty,默认为‘

解决方案

解决方法如下:

  1. 将类级别属性name重命名为home_namename以外的其他名称
  2. 在每个屏幕上添加id
  3. 使用root.manager.ids引用另一个屏幕中声明的小部件。
  4. sm.current替换self.manager.current,因为默认情况下每个屏幕都有一个属性管理器,该管理器为您提供所使用的ScreenManager的实例。

示例

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty


class ScreenManagement(ScreenManager):
    pass


class ChangeText(Screen):
    pass


class Box(Screen):
    home_name = StringProperty("sometext")

    def change_text(self):
        self.manager.current = 'changetext'


class TestApp(App):

    def build(self):
        return ScreenManagement()


if __name__ == "__main__":
    TestApp().run()

test.kv

#:kivy 1.11.0

<ScreenManagement>:
    Box:
        id: box
        name: 'box'

    ChangeText:
        id: changeText
        name: 'changetext'

<ChangeText>:
    BoxLayout:
        TextInput:
            id: txt
            multiline: False
            text: root.manager.ids.box.home_name
        Button:
            text: "Save"
            on_release: root.manager.ids.box.home_name = txt.text

<Box>:
    BoxLayout:
        Button:
            text: root.home_name
            on_press: root.change_text()

输出

Img01 - Box Screen Img02 - ChangeText Screen