【问题标题】:How to Pass args without affecting "self"如何在不影响“自我”的情况下传递参数
【发布时间】:2020-12-06 04:40:19
【问题描述】:

我已经用这个代码工作了几天了。

我不能让它工作,我的目标是在不影响'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'

当我为 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'

希望你能帮助我编写这个简单的代码。

非常感谢!

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    你有两个选择。

    1. 您可以直接从您的 kv 文件中传递它。由于您已经在ThisScreen 屏幕上,您可以在python 中删除您的on_relase 方法并从根目录调用.kv 中的函数,如下所示:

    PassdataButton:
        text: "Apple's & 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
    
    
    

    【讨论】:

    • 深!!!选项 2 是最甜蜜的,我可以将其应用于其他对象,如触摸或 RV .. 非常感谢答案。这是我在 Kivy 文档中查看的内容,如何像这样查看对象/小部件的分层视图 ---->> 'App.get_running_app().root.get_screen('ThisScreen').getters' 可以你指出我在哪里可以找到这个文档?非常感谢!
    • 您可以在App class documentationScreen Manager (your root) documentation 上阅读更多相关信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2022-12-23
    • 2023-03-15
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多