【问题标题】:python/kivy : access attribute value in .kv filepython/kivy : 访问 .kv 文件中的属性值
【发布时间】:2025-12-06 06:30:06
【问题描述】:

当我点击 Account(root.display_account()) 然后调用 display_account()。在 RVACCOUNT() 函数调用之后。之后当我点击 +Add Account 然后 def add_account(self): call

我有一个 AccountPopup 类,它定义属性 state_text 并在 .kv 文件中分配值 text:'Testing'
如何获取 state_text 'Testing' 的值并传入 on_text: root.filter(self.text,state_text) 并在 def 过滤函数中打印。

test.py

class AccountPopup(Popup):
    state_text = ObjectProperty(None)
    popupAccountCity = ObjectProperty(None)


    def display_cities_treeview_account(self, instance):
        if len(instance.text) > 0:
            #if self.popupAccountCity is None:
            self.popupAccountCity = TreeviewCityAccount(self.state_text.text)
            self.popupAccountCity.filter(instance.text,self.state_text.text)
        self.popupAccountCity.open()


class TreeviewCityAccount(Popup):
    state_text = ObjectProperty(None)

    def __init__(self,state_text, **kwargs):
        print(state_text)

    def filter(self, f,state):
        print(state)


class RVACCOUNT(BoxLayout):
    def add_account(self):
        self.mode = "Add"
        popup = AccountPopup(self)
        popup.open()

class MainMenu(BoxLayout):

    def display_account(self):
        self.dropdown.dismiss()
        self.remove_widgets()
        self.rvaccount = RVACCOUNT()
        self.content_area.add_widget(self.rvaccount)


class FactApp(App):
    title = "Test"

    def build(self):
        self.root = Builder.load_file('test.kv')
        return MainMenu()



if __name__ == '__main__':
    FactApp().run()

test.kv

<AccountPopup>:
    state_text:state_text

        TextInput:
            id:state_text
            text:'Testing'

<TreeviewCityAccount>:

    BoxLayout
        orientation: "vertical"

        TextInput:
            id: treeview
            size_hint_y: .1
            on_text: root.filter(self.text,state_text)

<RVACCOUNT>:
    BoxLayout:
        orientation: "vertical"
        Button:
            size_hint: .07, .03
            text: "+Add Account"
            on_press: root.add_account()


<MainMenu>:
    content_area: content_area
    dropdown: dropdown

    BoxLayout:
        orientation: 'vertical'
        #spacing : 10

        BoxLayout:
            canvas.before:
                Rectangle:
                    pos: self.pos
                    size: self.size

            MenuButton:
                    id: btn
                    text: 'Master'
                    size : (60,30)
                    on_release: dropdown.open(self)

            CustDrop:

                DropdownButton:
                    text: 'Account'
                    size_hint_y: None
                    height: '32dp'
                    on_release: root.display_account()

有人可以帮我吗?

【问题讨论】:

  • 您在哪里打开 AccountPopup?

标签: python python-3.x python-2.7 kivy kivy-language


【解决方案1】:

您要查找的值不在您的直接根目录中,这就是为什么这不起作用。要做的就是获取该属性的完整路径,如下所示: 片段

<AccountPopup>:
    id: ac_popup
    #bunch of code
 <TreeviewCityAccount>:
    #chunk of code
    TextInput:
       id: tree view
       on_text:root.filter(self.text,app.ac_popup.state_text

另外,一般来说,最好是给你的同学打个招呼

免责声明:代码未经测试

【讨论】:

    【解决方案2】:

    您应该在任何地方将其引用为self.state_text,并在 py 文件中将其设置为 StringProperty,然后可以访问它

    on_text: root.filter(self.text,root.state_text)
    

    在你的情况下,kv 中的 root 指的是最左边的小部件,也就是 &lt;TreeviewCityAccount&gt;:

    https://kivy.org/docs/api-kivy.lang.html

    您也可以使用 kv 文件中的 id。

    【讨论】: