通过屏幕管理器 kivy 恢复输入值
Recup input value through screen manager kivy
我想从我的第一个屏幕捕捉一个值到我的第三个屏幕。
首先,我在输入栏中写下我的名字。
我去下一个window.
并且我尝试在最后一个 window 中展示我的名字。
所以我与您分享代码,希望我能找到问题。
Python代码:
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen
#define ou different screens
class FirstWindow(Screen):
def envoyer(self):
name = self.ids.nom_input.text
self.ids.my_name.text = name
class SecondWindow(Screen):
pass
class ThirdWindow(Screen):
#PROBLEM HERE
def on_press(self):
self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text
class WindowManager(ScreenManager):
pass
class MonWidget(Widget):
pass
kv = Builder.load_file('new_window.kv')
class AwesomeApp(App):
def build(self):
Window.clearcolor = (0,0,0,0)
return kv
if __name__ == '__main__':
AwesomeApp().run()
我的 KV 代码:
WindowManager:
FirstWindow:
SecondWindow:
ThirdWindow:
<FirstWindow>:
name: "romain"
BoxLayout:
orientation: "vertical"
size: root.width, root.height
Label:
id: my_name
text: "Entrez votre nom"
font_size: 32
TextInput:
id: nom_input
multiline: False
size_hint: (1, .5)
Button:
text: "Next screen"
font_size: 32
on_press: root.envoyer()
on_release:
app.root.current = "Mickael"
root.manager.transition.direction = "left"
<SecondWindow>:
name: "Mickael"
BoxLayout:
orientation: "vertical"
size: root.width, root.height
Label:
text: "Entre votre ville"
font_size: 32
TextInput:
id: ville_input
multiline: False
size_hint: (1, .5)
Button:
text: "Vérifier les infos"
font_size: 32
on_release:
app.root.current = "foncier"
root.manager.transition.direction = "left"
Button:
text: "go back first screen"
font_size: 32
on_release:
app.root.current = "romain"
root.manager.transition.direction = "right"
<ThirdWindow>:
name: "foncier"
BoxLayout:
orientation: "vertical"
size: root.width, root.height
Label:
text: "Verifier : "
font_size: 32
Label:
id: recup_infos
text: ""
font_size: 32
color: 'white'
Button:
text: "On press"
font_size: 32
#Problem HERE
on_press: root.on_press()
Button:
text: "Précedent"
font_size: 32
on_release:
app.root.current = "Mickael"
root.manager.transition.direction = "right"
你能帮帮我吗?
谢谢
罗曼
在您的 on_press
方法中:
def on_press(self):
self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text
self.root.get_screen('FirstWindow').ids.my_name.text
不是访问您现在所在的 class 之外的小部件的正确方法,或者在这种情况下,屏幕。正确的方法是使用App.get_running_app()
方法:
self.ids.recup_infos.text = App.get_running_app().root.ids.First.ids.my_name.text
但在此之前,您必须为应用程序的屏幕提供 ID,以便上面演示的方法的 First
参数实际上有意义:
WindowManager:
FirstWindow:
id: First
# "First" is the id of the FirstWindow class
# which can also explain why there was a "First" arg
# inside "App.get_running_app().root.ids.First.ids.my_name.text"
SecondWindow:
id: Second
ThirdWindow:
id: Third
仍然对为什么这有效感到困惑?我们把App.get_running_app().root.ids.First.ids.my_name.text
的属性分成3部分:
App.get_running_app()
:此方法 returns 您的 运行ning App class 的位置,在本例中为 AwesomeApp
。如果您要在 App 对象本身中获取变量,这也充当 self
.root.ids.First
:如果你读过Kivy的文档,或者只是单纯的在网上看过Kivy的课程视频,细心的你应该知道self.root.ids
里面的App对象returns一个列表根小部件内的小部件的 ID。在这种情况下,App.get_running_app().root.ids
在这里做同样的事情,并且您的屏幕在 ScreenManager
根小部件中传递,因此使 First
成为 App.get_running_app().root.ids
[=43 中的可用属性=]
.ids.my_name.text
:同上,App.get_running_app().root.ids.First
和 self
一样,如果你要 运行 它在你的 FirstWindow
class,这让您有机会在工作之外访问变量 classes/screens
我想从我的第一个屏幕捕捉一个值到我的第三个屏幕。
首先,我在输入栏中写下我的名字。 我去下一个window.
并且我尝试在最后一个 window 中展示我的名字。
所以我与您分享代码,希望我能找到问题。
Python代码:
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.uix.screenmanager import ScreenManager, Screen
#define ou different screens
class FirstWindow(Screen):
def envoyer(self):
name = self.ids.nom_input.text
self.ids.my_name.text = name
class SecondWindow(Screen):
pass
class ThirdWindow(Screen):
#PROBLEM HERE
def on_press(self):
self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text
class WindowManager(ScreenManager):
pass
class MonWidget(Widget):
pass
kv = Builder.load_file('new_window.kv')
class AwesomeApp(App):
def build(self):
Window.clearcolor = (0,0,0,0)
return kv
if __name__ == '__main__':
AwesomeApp().run()
我的 KV 代码:
WindowManager:
FirstWindow:
SecondWindow:
ThirdWindow:
<FirstWindow>:
name: "romain"
BoxLayout:
orientation: "vertical"
size: root.width, root.height
Label:
id: my_name
text: "Entrez votre nom"
font_size: 32
TextInput:
id: nom_input
multiline: False
size_hint: (1, .5)
Button:
text: "Next screen"
font_size: 32
on_press: root.envoyer()
on_release:
app.root.current = "Mickael"
root.manager.transition.direction = "left"
<SecondWindow>:
name: "Mickael"
BoxLayout:
orientation: "vertical"
size: root.width, root.height
Label:
text: "Entre votre ville"
font_size: 32
TextInput:
id: ville_input
multiline: False
size_hint: (1, .5)
Button:
text: "Vérifier les infos"
font_size: 32
on_release:
app.root.current = "foncier"
root.manager.transition.direction = "left"
Button:
text: "go back first screen"
font_size: 32
on_release:
app.root.current = "romain"
root.manager.transition.direction = "right"
<ThirdWindow>:
name: "foncier"
BoxLayout:
orientation: "vertical"
size: root.width, root.height
Label:
text: "Verifier : "
font_size: 32
Label:
id: recup_infos
text: ""
font_size: 32
color: 'white'
Button:
text: "On press"
font_size: 32
#Problem HERE
on_press: root.on_press()
Button:
text: "Précedent"
font_size: 32
on_release:
app.root.current = "Mickael"
root.manager.transition.direction = "right"
你能帮帮我吗? 谢谢 罗曼
在您的 on_press
方法中:
def on_press(self):
self.ids.recup_infos.text = self.root.get_screen('FirstWindow').ids.my_name.text
self.root.get_screen('FirstWindow').ids.my_name.text
不是访问您现在所在的 class 之外的小部件的正确方法,或者在这种情况下,屏幕。正确的方法是使用App.get_running_app()
方法:
self.ids.recup_infos.text = App.get_running_app().root.ids.First.ids.my_name.text
但在此之前,您必须为应用程序的屏幕提供 ID,以便上面演示的方法的 First
参数实际上有意义:
WindowManager:
FirstWindow:
id: First
# "First" is the id of the FirstWindow class
# which can also explain why there was a "First" arg
# inside "App.get_running_app().root.ids.First.ids.my_name.text"
SecondWindow:
id: Second
ThirdWindow:
id: Third
仍然对为什么这有效感到困惑?我们把App.get_running_app().root.ids.First.ids.my_name.text
的属性分成3部分:
App.get_running_app()
:此方法 returns 您的 运行ning App class 的位置,在本例中为AwesomeApp
。如果您要在 App 对象本身中获取变量,这也充当self
.root.ids.First
:如果你读过Kivy的文档,或者只是单纯的在网上看过Kivy的课程视频,细心的你应该知道self.root.ids
里面的App对象returns一个列表根小部件内的小部件的 ID。在这种情况下,App.get_running_app().root.ids
在这里做同样的事情,并且您的屏幕在ScreenManager
根小部件中传递,因此使First
成为App.get_running_app().root.ids
[=43 中的可用属性=].ids.my_name.text
:同上,App.get_running_app().root.ids.First
和self
一样,如果你要 运行 它在你的FirstWindow
class,这让您有机会在工作之外访问变量 classes/screens