Kivy:从另一个 Class 中的 Widget 检索文本?
Kivy: Retrieving Text from Widget in another Class?
我正在尝试从另一个 class(此处 "GetInfoFromAnotherClass")访问一个 class(此处 "UserInput")的 TextInput.text。但是,"Retrieve Info" 按钮仅提供初始输入,不会更新。而从 class "UserInput" 内部是没有问题的 --> Button "Get Info"。无论我在文本字段中输入什么,"Retrieve Info"-按钮总是 returns "First Input"。我不知道要 google 干什么了。希望各位能帮帮我!
这是我的问题的 "close to minimal" 示例:
import kivy
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
class Container(GridLayout):
pass
class UserInput(BoxLayout):
first_input = ObjectProperty(None)
second_input = ObjectProperty(None)
def __init__(self,**kwargs):
super().__init__(**kwargs)
def ui_btn(self):
print(self.first_input.text)
print(self.second_input.text)
class GetInfoFromAnotherClass(BoxLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
self.ui = UserInput()
def retrieve_info(self):
print(self.ui.first_input.text)
print(self.ui.second_input.text)
class MainApp(App):
def build(self):
return Container()
if __name__=='__main__':
MainApp().run()
和main.kv:
#:kivy 1.11.0
# Well this is just for Beauty ;-)
<MyTextInput@TextInput>:
size_hint_y: None
height: 50
multiline: False
write_tab: False
<MyButton@Button>:
size_hint_y: None
height: 50
<Container>:
cols: 1
UserInput
GetInfoFromAnotherClass
<UserInput>:
first_input: first_input
second_input: second_input
size_hint_y: None
height: self.minimum_height
padding: 20
MyTextInput:
id: first_input
text: "First Entry"
MyTextInput:
id: second_input
text: "Second Entry"
MyButton:
text: "Get Info in the same class"
on_press: root.ui_btn()
<GetInfoFromAnotherClass>:
size_hint_y: None
height: self.minimum_height
padding: 20
MyButton:
text: "Retrieve Info from another Class"
on_press: root.retrieve_info()
self.ui = UserInput()
调用创建了一个不同的 UserInput
实例,一个没有人使用的实例。
访问文本框的一种方法是:
- 首先给你的
UserInput
实例一个id
<Container>:
cols: 1
UserInput:
id: user_input_box
GetInfoFromAnotherClass:
- 创建一个存储当前 运行 应用程序的变量
class GetInfoFromAnotherClass(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.app = App.get_running_app()
# self.ui = UserInput()
- 之后,使用下面的代码访问文本..
def retrieve_info(self):
print(self.app.root.ids.user_input_box.ids.first_input.text)
print(self.app.root.ids.user_input_box.ids.second_input.text)
我正在尝试从另一个 class(此处 "GetInfoFromAnotherClass")访问一个 class(此处 "UserInput")的 TextInput.text。但是,"Retrieve Info" 按钮仅提供初始输入,不会更新。而从 class "UserInput" 内部是没有问题的 --> Button "Get Info"。无论我在文本字段中输入什么,"Retrieve Info"-按钮总是 returns "First Input"。我不知道要 google 干什么了。希望各位能帮帮我!
这是我的问题的 "close to minimal" 示例:
import kivy
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
class Container(GridLayout):
pass
class UserInput(BoxLayout):
first_input = ObjectProperty(None)
second_input = ObjectProperty(None)
def __init__(self,**kwargs):
super().__init__(**kwargs)
def ui_btn(self):
print(self.first_input.text)
print(self.second_input.text)
class GetInfoFromAnotherClass(BoxLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
self.ui = UserInput()
def retrieve_info(self):
print(self.ui.first_input.text)
print(self.ui.second_input.text)
class MainApp(App):
def build(self):
return Container()
if __name__=='__main__':
MainApp().run()
和main.kv:
#:kivy 1.11.0
# Well this is just for Beauty ;-)
<MyTextInput@TextInput>:
size_hint_y: None
height: 50
multiline: False
write_tab: False
<MyButton@Button>:
size_hint_y: None
height: 50
<Container>:
cols: 1
UserInput
GetInfoFromAnotherClass
<UserInput>:
first_input: first_input
second_input: second_input
size_hint_y: None
height: self.minimum_height
padding: 20
MyTextInput:
id: first_input
text: "First Entry"
MyTextInput:
id: second_input
text: "Second Entry"
MyButton:
text: "Get Info in the same class"
on_press: root.ui_btn()
<GetInfoFromAnotherClass>:
size_hint_y: None
height: self.minimum_height
padding: 20
MyButton:
text: "Retrieve Info from another Class"
on_press: root.retrieve_info()
self.ui = UserInput()
调用创建了一个不同的 UserInput
实例,一个没有人使用的实例。
访问文本框的一种方法是:
- 首先给你的
UserInput
实例一个id
<Container>:
cols: 1
UserInput:
id: user_input_box
GetInfoFromAnotherClass:
- 创建一个存储当前 运行 应用程序的变量
class GetInfoFromAnotherClass(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.app = App.get_running_app()
# self.ui = UserInput()
- 之后,使用下面的代码访问文本..
def retrieve_info(self):
print(self.app.root.ids.user_input_box.ids.first_input.text)
print(self.app.root.ids.user_input_box.ids.second_input.text)