Как передавать аргументы, не затрагивая «себя»

#python #python-3.x #kivy #kivy-language

#python #python-3.x #kivy #kivy-язык

Вопрос:

Я работаю с этим кодом уже несколько дней.

Я не могу заставить это работать, моя цель — передать аргументы из функции из другого КЛАССА в другую функцию в другом КЛАССЕ, не затрагивая «себя»

Пожалуйста, посмотрите пример кода.

PY — КОД:

 `    
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.button import Button



#Custom Button
class PassdataButton(Button):
    def on_release(self):
        ThisScreen.getters(datas=['5','3'])

class ThisScreen(Screen):
    def getters(self,datas):
        self.ids.gettersBox.text = f"There is {datas[0]} Apple's and {datas[0]} Banana's"

class SM(ScreenManager):
    pass

kv_file = Builder.load_file('getData.kv')

class projectApps(App):
    def build(self):
        return kv_file

if __name__ == "__main__":
    projectApps().run()
`
 

КОД KV:

 SM:
    ThisScreen:
        name: 'ThisScreen'


<ThisScreen>:

    canvas.before:
    canvas:
        Rectangle:
            size: self.size
            source: 'im-502378444.jpg'

    BoxLayout:
        padding: 10
        orientation: 'vertical'
        TextInput:
            id: gettersBox

        BoxLayout:
            size_hint_y: .3
            orientation: 'horizontal'
            Button:
                text: 'GetterButton'
                on_release: root.getters(datas = 'this data is from GetterButton')

            #CustomButton    
            PassdataButton:
                text: "Apple's amp; Banana's"
 

Каждый раз, когда я запускаю код и нажимаю созданную мной пользовательскую кнопку, я получаю сообщение об ошибке

      ThisScreen.getters(datas=['5','3'])
 TypeError: getters() missing 1 required positional argument: 'self'
 

Когда я добавляю значение для отсутствующего позиционного аргумента для self, например ThisScreen.getters(self=True, datas=['5','3']) , он выдает мне другую ошибку, и я больше не могу обращаться / вызывать другие элементы в функции getters().

      self.ids.gettersBox.text = f"There is {datas[0]} Apple's and {datas[0]} Banana's"
 AttributeError: 'bool' object has no attribute 'ids'
 

Надеюсь, вы сможете помочь мне с этим простым кодом.

Большое спасибо!

Ответ №1:

У вас есть два варианта.

1. Вы можете передать его прямо из своего файла kv. Поскольку вы уже находитесь на ThisScreen экране, вы можете просто удалить свой on_relase метод в python и вызвать функцию внутри .kv из корня следующим образом:

 PassdataButton:
    text: "Apple's amp; Banana's"
    on_release: root.getters(datas=['5', '3'])
 

2. Или, если вы хотите использовать для этого python, вам нужно будет получить запущенное приложение, диспетчер экранов, затем перейти к экрану с нужной функцией, и только там вы сможете вызвать свой геттер:

 class PassdataButton(Button):
    def on_release(self):
        App.get_running_app().root.get_screen('ThisScreen').getters(datas=['5', '3'])
# App -> App instance
# get_running_app() -> current running
# root -> Screen Manager
# get_screen('ThisScreen') -> Desired screen


 

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

1. ГЛУБОКО!!! Вариант 2 был самым приятным, я могу применить его к другим объектам, таким как касания или RV .. очень ценю ответ. Это то, что я ищу в документации Kivy, как просмотреть иерархическое представление объекта / виджета точно так же, как это —->> ‘App.get_running_app().root.get_screen(‘ThisScreen’).getters’ можете ли вы указать мне, где я могу найти эту документацию? большое спасибо!

2. Вы можете прочитать больше об этом в документации по классу приложения и в документации Screen Manager (вашего root)