【问题标题】:How to change label from another class in kivy?如何在kivy中更改另一个类的标签?
【发布时间】:2021-11-14 17:07:28
【问题描述】:

我的应用程序有 2 个窗口。第二个窗口有一个标签,我想用第一个窗口按钮更改它的文本。但每次我得到同样的错误:

AttributeError: 'super' object has no attribute '__getattr__'

这是我的 Python 代码:

from kivy.lang.builder import Builder
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen

class WindowManager(ScreenManager):
    pass

class FirstWindow(Screen):
    def change_label(self):
        self.parent.ids.label_id.text = 'label is changed'
        
class SecondWindow(Screen):
    pass

Builder.load_file('new.kv') 

class FirstApp(App): 
    def build(self):
        screen_manager = ScreenManager()
        screen_manager.add_widget(FirstWindow(name = 'first'))
        screen_manager.add_widget(SecondWindow(name = 'second'))
        return screen_manager

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

还有我的.kv 文件:

#:kivy 2.0.0

<FirstWindow>:
    name: "first"
    padding: 50
    spacing: 250

    BoxLayout:
        padding: 50
        spacing: 250
        orientation: 'vertical'  

        Button:
            text: 'change_label'
            pos_hint: {'center_x': 0.5, 'center_y': 0.15}
            on_release:
                root.change_label()
        
        Button:
            text: 'second window'
            pos_hint: {'center_x': 0.5, 'center_y': 0.15}
            on_release:
                root.manager.current = 'second'
                root.manager.transition.direction = 'left'
         
<SecondWindow>:
    name: 'second' 
    padding: 50
    spacing: 250
    label_id: label_id
   
    BoxLayout:
        padding: 50
        spacing: 50
        orientation: 'vertical'   

        Label:
            id: label_id
            text: 'this label'
   
        Button:
            text: 'first window'  
            on_release:
                app.root.current = "first" 
                root.manager.transition.direction = 'right' 

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    您只需要获取对SecondWindow 实例的引用,您可以使用ScreenManagerget_screen() 方法来做到这一点:

    class FirstWindow(Screen):
        def change_label(self):
            # self.parent.ids.label_id.text = 'label is changed'
            self.manager.get_screen('second').ids.label_id.text = 'label is changed'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-16
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2018-05-23
      相关资源
      最近更新 更多