我有两个屏幕。 在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'
### ?!?!? ###
答案 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 的变量/属性,因为它是用于命名/识别屏幕的保留字。
name
在ScreenManager中必须唯一的屏幕名称。这个 是ScreenManager.current的名称。
name是StringProperty,默认为‘>
解决方法如下:
name
重命名为home_name
或name
以外的其他名称id
。root.manager.ids
引用另一个屏幕中声明的小部件。sm.current
替换self.manager.current
,因为默认情况下每个屏幕都有一个属性管理器,该管理器为您提供所使用的ScreenManager的实例。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()
#: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()