如何在不影响 "self" 的情况下传递参数

How to Pass args without affecting "self"

我已经使用这段代码几天了。

我无法让它工作,我的目标是将来自不同 CLASS 的函数的参数传递给不同 CLASS 中的另一个函数而不影响 'self '

请查看示例代码。

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 & Banana's"

每次我 运行 代码并单击我创建的自定义按钮时,都会出现错误

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

当我为缺少的位置参数添加一个值时,例如 ThisScreen.getters(self=True, datas=['5','3']) 它给了我不同的错误,我不能 access/call 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. 您可以直接从您的 kv 文件传递​​它。由于您已经在 ThisScreen 屏幕上,您可以只删除 python 中的 on_relase 方法并从根目录调用 .kv 中的函数,如下所示:

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

2. 或者如果你想为此使用 python,你将必须获得你的 运行 应用程序,屏幕管理器,然后跳转到具有所需功能的屏幕,只有在那里你才能调用你的 getter:

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