#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()