2

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

我已经下课了

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 仅适用于第一个字段(它只看到在“请删除 file1”字段中删除的文件,在其他情况下它收到一个删除,但无法确认它在第二个字段的范围内,就好像它只绑定on_dropfile第一个对象的功能)。

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

4

1 回答 1

2

现在对我来说更有意义了。在这种情况下,您为什么不直接列出并执行您喜欢的任何功能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类中处理,其他在其对应的函数中。

于 2016-07-30T00:09:58.600 回答