kivy on_dropfile 多重绑定

kivy on_dropfile multiple bindings

是否可以在多个对象中绑定 on_dropfile?或者它总是只有一个绑定?

我已经贴花了 class

class dropFile(Label):
    def __init__(self, **kwargs):
        super(dropFile, self).__init__(**kwargs)
        Window.bind(mouse_pos=lambda w, p: setattr(helper, 'mpos', p))
        Window.bind(on_dropfile=self.on_dropfile)

    def on_dropfile(self, *args):
        print ("ding")
        if (self.center_x - self.width/2 < helper.mpos[0] < self.center_x + self.width/2 and
                self.center_x - self.height/2 < helper.mpos[1] < self.center_y + self.height/2):
            print('dong')
            self.text = str(args[1])

在 kv 中,我只是将其用作

dropFile:
    text: "Please drop file1"
dropFile:
    text: "Please drop file2"

但 in 仅适用于第一个字段(它只看到在 "Please drop file1" 字段上删除的文件,在其他情况下它收到一个删除,但无法确认它在第二个字段的范围内,就好像它只绑定了第一个对象的 on_dropfile 函数)。

有没有什么优雅的方法可以实现多个对象?

现在对我来说更有意义了。在这种情况下,您为什么不直接列一个列表并在 Window.on_dropfile 上执行您喜欢的任何功能?

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
Builder.load_string('''
<DropFile>:
<Box>:
    DropFile:
        text: 'left'
    DropFile:
        text: 'right'
''')

class Box(BoxLayout):
    pass

class Test(App):
    def build(self):
        self.drops = []
        Window.bind(on_dropfile=self.handledrops)
        return Box()
    def handledrops(self, *args):
        for i in self.drops:
            i(*args)

class Helper:
    pass

class DropFile(Label):
    def __init__(self, **kwargs):
        super(DropFile, self).__init__(**kwargs)
        Window.bind(mouse_pos=lambda w, p: setattr(Helper, 'mpos', p))
        app = App.get_running_app()
        app.drops.append(self.on_dropfile)

    def on_dropfile(self, *args):
        print ("ding")
        if (self.center_x - self.width/2 < Helper.mpos[0] < self.center_x + self.width/2 and
                self.center_x - self.height/2 < Helper.mpos[1] < self.center_y + self.height/2):
            print('dong')
            self.text = str(args[1])

Test().run()

我觉得效果不错。与 Window 直接相关的异常 on_dropfile 在 App class 中处理,其他在其相应​​的函数中。