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