如何使用 kivy StringProperty?
Posted
技术标签:
【中文标题】如何使用 kivy StringProperty?【英文标题】:How to use a kivy StringProperty? 【发布时间】:2017-02-21 09:52:07 【问题描述】:我想实现一个 kivy 应用程序,它有两个屏幕(由屏幕管理器管理)。在第一个屏幕(称为 LoginScreen)上有两个 TextInput 字段和一个按钮。在第二个屏幕上,我有两个标签,我想显示在第一个屏幕上输入的值。单击按钮后更改屏幕完成。我设法将这些字段绑定在一起,以便将值显示在第二个屏幕上。但是,我想在第二个屏幕中“处理”这些值,不幸的是,我无法做到。 “过程”是指,我想使用定制的类(正在工作)登录我的电子邮件帐户并列出我看不见的电子邮件(由类的功能之一提供)在 kivy 列表中。 有人可以告诉我如何获取输入的值并使用它们来创建我的课程吗? 我将不胜感激任何帮助! 我的 .py 文件:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ListProperty, StringProperty
class MainScreenManager(ScreenManager):
pass
class LoginScreen(Screen):
entered_email_address = StringProperty('')
entered_password = StringProperty('')
def check_input(self):
text_input_email = self.ids['ti_email'].text
text_input_password = self.ids['ti_password'].text
self.entered_email_address = text_input_email
self.entered_password = text_input_password
"""
the values in this part are printed out
print self.manager
print self.manager.screens
print self.manager.get_screen('HomeScreen').email_address
print self.manager.get_screen('HomeScreen').password
"""
self.manager.current = 'HomeScreen'
class HomeScreen(Screen):
email_address = StringProperty()
password = StringProperty()
def __init__(self, *args, **kwargs):
super(HomeScreen, self).__init__(*args, **kwargs)
class TutorialApp(App):
def build(self):
return MainScreenManager()
if __name__ == '__main__':
TutorialApp().run()
我的 .kv 文件:
<MainScreenManager>:
id: screen_manager
LoginScreen:
id: login_screen
name: 'LoginScreen'
manager: screen_manager
HomeScreen:
id: home_screen
name: 'HomeScreen'
email_address: login_screen.entered_email_address
password: login_screen.entered_password
<LoginScreen>
BoxLayout:
orientation: 'vertical'
TextInput:
id: ti_email
multiline: False
size_hint_y: None
height: 40
font_size: 25
TextInput:
id: ti_password
multiline: False
size_hint_y: None
height: 40
font_size: 25
Button:
id: btn_login
text: 'Login!'
height: 100
width: 150
on_press:
root.check_input()
<HomeScreen>
BoxLayout:
orientation: 'vertical'
Label:
text: root.email_address
Label:
text: root.password
【问题讨论】:
您的问题是关于使用字符串属性,还是在屏幕之间传递数据?因为如果是第二个,这里有很多示例,您可以轻松找到它们。 感谢您的回复。我添加了源代码。如果我尝试从变量 email_addess 和密码中获取值,例如在 HomeScreen 的 init 方法中,我不能(我想将它们打印出来)。在我在 check_input 方法中注释掉的部分中,我可以访问 HomeScreen 的属性值。 查看本主题:link 在您提到的答案中,可以在 python 代码中绑定这两个属性。你能告诉我它是怎么做的吗?我更喜欢这种方式而不是另一种方式(即编写 kv 代码)。提前感谢您的回答,非常感谢您的帮助! 【参考方案1】:根据 cmets 部分的要求,我创建了一个不使用 kv lang 的小部件之间绑定属性的示例。请记住,这可能不是实现目标的最佳方式,因为在这里使用 kv lang 会更容易。
from kivy.app import App
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty, ObjectProperty
from kivy.clock import mainthread
from kivy.lang import Builder
gui = '''
MyScreenManager
HomeScreen
name: 'home'
LoginScreen
name: 'login'
<HomeScreen>
nickname_input: nickname_input
nickname: nickname_input.text
BoxLayout:
TextInput
id: nickname_input
Button
on_press: root.manager.current = 'login'
<LoginScreen>
BoxLayout:
Label
text: root.nickname
Button
on_press: root.manager.current = 'home'
'''
class HomeScreen(Screen):
nickname_input = ObjectProperty()
nickname = StringProperty()
class LoginScreen(Screen):
nickname = StringProperty()
class MyScreenManager(ScreenManager):
def __init__(self, *args, **kwargs):
super(MyScreenManager, self).__init__(*args, **kwargs)
@mainthread
def delayed():
home_screen = self.get_screen('home')
login_screen = self.get_screen('login')
home_screen.bind(nickname=login_screen.setter('nickname'))
delayed()
class Test(App):
def build(self):
return Builder.load_string(gui)
Test().run()
【讨论】:
以上是关于如何使用 kivy StringProperty?的主要内容,如果未能解决你的问题,请参考以下文章