Kivy вызывает собственный метод из другого класса

#python #class #methods #kivy #self

#питон #класс #методы #киви #самость

Вопрос:

В этой очень простой программе kivy python я пытаюсь изменить текстовую метку из класса Window2, используя метод в классе Window1. Когда я вызываю Window2 для метода Window1, запускается метод, но self.ids …. линия не закончена.

Есть какие-нибудь идеи, что нужно изменить, чтобы self.ids.label1.text = "DONE" это сработало?

файл python

 from kivy.uix.boxlayout import BoxLayout


class ParentWindow(BoxLayout):
    pass


class Window1(BoxLayout):

    def update(self):
        print("This print works, but next line not ...")
        self.ids.label1.text = "DONE"


class Window2(BoxLayout):

    def try_change(self):
        Window1().update()


class MyProgramApp(App):
    def build(self):
        return ParentWindow()


MyProgramApp().run()
 

файл kivy

 <ParentWindow>:
    Window1:
    Window2:

<Window1>:
    orientation: "vertical"
    Label:
        id: label1
        text: "Try to change me"
    Button:
        text: "Works fine from self class"
        on_press: root.update()

<Window2>:
    Button:
        text: "Lets try"
        on_press: root.try_change()
 

Ответ №1:

Всякий раз, когда у вас есть имя класса, за которым следует () в вашем коде, вы создаете новый экземпляр этого класса. Таким Window1().update() образом, в try_change() методе создается новый экземпляр Window1 (не связанный с тем, который находится в вашем графическом интерфейсе) и вызывается update() этот новый экземпляр. Это никак не повлияет на то, что вы видите в своем графическом интерфейсе.

Вам нужно получить доступ к экземпляру Window1 , который на самом деле находится в вашем графическом интерфейсе. Для этого вы можете изменить try_change() на:

 def try_change(self):
    # Window1().update()
    window1 = App.get_running_app().root.ids.window1
    window1.update()
 

Наряду с добавлением window1 идентификатора в ваш kv :

 <ParentWindow>:
    Window1:
        id: window1
    Window2:
 

Комментарии:

1. Спасибо за ответ, но, к сожалению, он не работает. window1 = App.get_running_app().root.ids.winndow1 Файл «kivy properties.pyx», строка 864, в kivy.properties. ObservableDict.__getattr__ AttributeError: объект ‘super’ не имеет атрибута ‘ getattr

Ответ №2:

Я нашел решение:

.пи

 from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class ParentWindow(BoxLayout):
    pass


class Window1(BoxLayout):

    def update(self):
        print("This print work, but next line not ...")
        self.ids.label1.text = "DONE"


class Window2(BoxLayout):

    def try_change(self):
        self.parent.ids.win1.update()


class MyProgramApp(App):
    def build(self):
        return ParentWindow()


MyProgramApp().run()
 

.кв

 <ParentWindow>:
    Window1:
        id: win1
    Window2:


<Window1>:
    orientation: "vertical"
    Label:
        id: label1
        text: "Try to change me"
    Button:
        text: "Works fine from self class"
        on_press: root.update()

<Window2>:
    Button:
        text: "Lets try"
        on_press: root.try_change()