Kivy: Функция \ Метод не работает из другого класса - PullRequest
0 голосов
/ 26 ноября 2018

Я сделал две кнопки, которые имеют одинаковый путь к функции.Работает только одна из кнопок.Обе кнопки должны изменить lines в circle.

Я читал в другом посте, что мне может понадобиться «связать» два класса вместе, чтобы они могли «разговаривать».Если у кого-то есть понимание, пожалуйста, сообщите мне!

Кроме того, почему функция print работает на обеих кнопках, но не на остальных?

Py:

from kivy.app import App
from kivy.properties import ListProperty
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen

class Screen1(Screen):
    pass

class SM(ScreenManager):
    pass

class ButtonX(Button):
    def increaseX(self):
        TestApp().increase()

class TestApp(App):

    random_num_list = ListProperty([20, 40, 80])

    def increase(self):
        print(str(self.random_num_list))
        self.random_num_list = [90, 140, 220]

    def build(self):
        global sm
        sm = SM()
        return sm

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

Kv:

<Screen1>:
    FloatLayout:
        Button:
            pos_hint: {'center_x': .5, 'center_y': .5}

            canvas:
                Color:
                    rgba: 1,1,1,1
                Line:
                    width: 5
                    circle: self.center_x, self.center_y, min(self.width, self.height) / 4, 0, app.random_num_list[0]

                Color:
                    rgba: .8,.1,.8,1
                Line:
                    width: 5
                    circle: self.center_x, self.center_y, min(self.width, self.height) / 4, app.random_num_list[0], app.random_num_list[1]

                Color:
                    rgba: .6,.6,1,1
                Line:
                    width: 5
                    circle: self.center_x, self.center_y, min(self.width, self.height) / 4, app.random_num_list[1], app.random_num_list[2]

                Color:
                    rgba: 1,.1,.4,1
                Line:
                    width: 5
                    circle: self.center_x, self.center_y, min(self.width, self.height) / 4, app.random_num_list[2], 360

        ButtonX:
            pos_hint: {'center_x': .5, 'center_y': .55}
            size_hint: .2, .1
            text: 'Try first:\ndoesn\'t works'
            on_press: self.increaseX()

        ButtonX:
            pos_hint: {'center_x': .5, 'center_y': .45}
            size_hint: .2, .1
            text: 'Try second:\nworks'
            on_press: app.increase()
<SM>:
    Screen1:

1 Ответ

0 голосов
/ 26 ноября 2018

Чтобы понять проблему, я собираюсь изменить код:

# ...
class ButtonX(Button):
    def increaseX(self):
        t2 = TestApp()
        print("t2", t2)
        t2.increase()
# ...
if __name__ == '__main__':
    t1 = TestApp()
    print("t1", t1)
    t1.run()

Получив следующее:

...
t1 <__main__.TestApp object at 0x7f8e750c38d0>
...
t2 <__main__.TestApp object at 0x7f8e71246320>
...

И ясно видно, что это 2 разных объекта, поэтомупри вызове increase() он не будет генерировать никаких изменений в текущем приложении.

В случае .kv используется app, который является объектом, который указывает приложение, которое являетсяв .py эквивалентен App.get_running_app(), поэтому решение состоит в том, чтобы использовать этот последний элемент.

from kivy.app import App
from kivy.properties import ListProperty
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen

class Screen1(Screen):
    pass

class SM(ScreenManager):
    pass

class ButtonX(Button):
    def increaseX(self):
        App.get_running_app().increase() # <---

class TestApp(App):
    random_num_list = ListProperty([20, 40, 80])

    def increase(self):
        print(str(self.random_num_list))
        self.random_num_list = [90, 140, 220]

    def build(self):
        sm = SM()
        return sm

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

Наконец, не используйте глобальные переменные, поскольку они являются головной больюпри отладке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...