【问题标题】:how to access an id from one class in another class如何从另一个类中的一个类访问 id
【发布时间】:2019-07-21 01:31:25
【问题描述】:

我想从 main 类访问一个 id 到 fahim2_pop 类。想要访问从文本输入(在主类中)到当有人按下搜索按钮时将出现的弹出小部件的单词。当有人搜索“hello”并按下搜索按钮时,弹出小部件将出现,并且在该弹出小部件中,标签的文本将与 textinput 中的“hello”相同。但标签和 id 仍然属于不同的类别。怎么办?

python 代码

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.properties import *

class fahim2_pop(Popup):
    pass

class main(BoxLayout):  
    def word(self):
        pop=fahim2_pop()
        pop.open()

class go(BoxLayout):
    def main(self):
        self.clear_widgets()
        self.add_widget(main())

class CallApp(App):
    def build(self):
        return go()

CallApp().run()

kv码

Builder.load_string('''

<main>:
    BoxLayout:
        orientation:"vertical"
        TextInput:
            id:word
        Button:
            text:"search"
            on_press:root.word()

<go>:
    Button:
        text:"go"
        on_press:root.go()

<fahim2_pop>:
    id:pop
    title:"result"
    BoxLayout:
        Label:
            text:app.root.ids.word.text 

''')

我知道 app.root.ids.word.text 如果该 id 保留在我的应用程序的根目录中。但这里是应用程序的根。如何从 fahim2_pop 类中的 main 类访问 id?

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    有几种方法可以解决这个问题。解决方法之一如下:

    py 文件

    • go() 类中的方法main() 重命名为go(),因为在您的kv 文件中,您已绑定on_press: root.go()
    • 实例化main()并将其存储在类属性main

    片段 - py 文件

    from kivy.properties import ObjectProperty
    ...
    
    class go(BoxLayout):
        main = ObjectProperty(None)    # declare class attribute
    
        def go(self):
            self.clear_widgets()
            self.main = main()
            self.add_widget(self.main)
    

    kv 文件

    • text:app.root.ids.word.text 替换为text:app.root.main.ids.word.text

    片段 - kv 文件

    <fahim2_pop>:
        ...
            Label:
                text:app.root.main.ids.word.text 
    

    示例 - main.py

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.lang import Builder
    from kivy.uix.popup import Popup
    from kivy.properties import ObjectProperty
    
    Builder.load_string('''
    
    <main>:
        BoxLayout:
            orientation:"vertical"
            TextInput:
                id:word
            Button:
                text:"search"
                on_press:root.word()
    
    <go>:
        Button:
            text:"go"
            on_press:root.go()
    
    <fahim2_pop>:
        id:pop
        title:"result"
        BoxLayout:
            Label:
                text:app.root.main.ids.word.text 
    
    ''')
    
    
    class fahim2_pop(Popup):
        pass
    
    
    class main(BoxLayout):
        def word(self):
            pop = fahim2_pop()
            pop.open()
    
    
    class go(BoxLayout):
        main = ObjectProperty(None)
    
        def go(self):
            self.clear_widgets()
            self.main = main()
            self.add_widget(self.main)
    
    
    class CallApp(App):
        def build(self):
            return go()
    
    
    CallApp().run()
    

    输出

    【讨论】:

    • 显示错误:AttributeError: 'function' object has no attribute 'ids'
    • 尝试运行我更新帖子中的示例。
    • 这里是我的应用程序的根目录。如果层次结构是 go>main>class "x"> 弹出窗口。我如何从类“x”访问该弹出小部件的 id?我认为它类似于在主类中实例化该类 x。但是如何在弹出窗口小部件中访问该 ID,如果在这里我不能使用 app.root 原因 main 不是根
    • 1) 在类main() 中声明一个类属性x(就像main)。 2)实例化类x()并保存,self.x = x()。 3)在参考中添加x,例如app.root.main.x.ids.word.text
    • 太棒了!好男人好棒!我浪费了很多时间来解决这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2023-04-07
    相关资源
    最近更新 更多