Python / Kivy - отправка переменных из одного класса в другой - PullRequest
2 голосов
/ 06 ноября 2019

Я не новичок в Python, поэтому у меня есть базовое понимание, но я бы не сказал, что я тоже такой замечательный.

У меня тонна проблем с бразильцемприложение джиу-джитсу, которое я пытаюсь сделать в Киви. Я пытаюсь получить текст от кнопки, которая была нажата в одном окне, а затем использовать этот текст в метке для следующего окна, которое отображается. В первом окне я дал имя класса GuardWindow(), а второе - SweepSubTranPage().

Мне удалось довольно легко отправить имя кнопки из моего файла KIVY в класс GuardsWindow(), а строка self.guardlabel = instance.text работает нормально и отлично выбирает имя кнопки. Однако моя основная проблема - отправить это имя в SweepSubTranPage(), чтобы я мог получить к нему доступ в своем файле kivy.

Вот код Python:

class GuardsWindow(Screen):

    guardButtonName = ObjectProperty(None)

    def send_guard_type(self, instance, **kwargs):
        self.guardButtonName = instance.text      # retrieves the button name


    def sender(self):            # my attempt at sending it to the other class
        return self.guardButtonName


class SweepSubTranPage(Screen):

    pageTitle = ObjectProperty(None)
    gw = GuardsWindow()
    pageTitle.text = gw.sender()


kv = Builder.load_file("my.kv")


class MyMainApp(App):
    def build(self):
        return kv

if __name__ == "__main__":
    MyMainApp().run()

А вот код файла Kivy:

<GuardsWindow>
    name: "GuardsHomepage"

    ScrollView:
        bar_width: 10
        do_scroll_x: False
        do_scroll_y: True
        scroll_type: ["bars", "content"]

        BoxLayout:
            orientation: "vertical"
            size_hint: 1, 2
            padding: 10
            spacing: 10

            Button:                  # these are the buttons that i am getting the text from
                text: "Full Guard"
                on_press:
                    root.send_guard_type(self)    # this sends the button
                on_release:
                    app.root.current = "SweepSubTranPage"
                    root.manager.transition.direction  = "left"


            Button:
                text: "Half Guard"
                on_press:
                    root.send_guard_type(self)    # this sends the button
                on_release:
                    app.root.current = "SweepSubTranPage"
                    root.manager.transition.direction  = "left"


<SweepSubTranPage>
    name: "SweepSubTranPage"
    pageTitle: title   

    BoxLayout:
        orientation: "horizontal"
        size_hint: 1, 0.1

        Label:              # this is the label that I need the text for
            id: title
            font_size: 40
            size_hint: 1, 1

Когда я запускаю код выше, я получаю ошибку:

   File "C:/Users/bensw/PycharmProjects/BJJ Tracker/main.py", line 36, in <module>
     class SweepSubTranPage(Screen):
   File "C:/Users/bensw/PycharmProjects/BJJ Tracker/main.py", line 40, in SweepSubTranPage
     pageTitle.text = gw.sender()
 AttributeError: 'kivy.properties.ObjectProperty' object has no attribute 'text'

Надеюсь, я достаточно ясно объяснил свою проблему. Если у вас есть какие либо вопросы, пожалуйста спрашивайте! Спасибо большое !!

1 Ответ

1 голос
/ 06 ноября 2019

В вашем методе send_guard_type() вы можете получить доступ к другому Screen, используя свойство manager любого Screen и метод get_screen() ScreenManager. Как то так:

def send_guard_type(self, instance, **kwargs):
    self.guardButtonName = instance.text      # retrieves the button name
    self.manager.get_screen("SweepSubTranPage").ids.title.text = instance.text
...