如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改kivy中的图像源?

在 kivy 小部件之间交换变量

如何从另一个类/屏幕 kivy 访问值

打印 NumericProperty() kivy 的值

Kivy - 无法更改带有 id 的 .text

Kivy 弹出 Filechooser 传递变量(选择)