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 中处理,其他在其相应的函数中。
是否可以在多个对象中绑定 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 中处理,其他在其相应的函数中。