2016-07-27 16 views
0

Ist es möglich, on_dropfile in mehreren Objekten zu binden? Oder ist es immer nur eine Bindung?kivy on_dropfile mehrfache Bindungen

Ich habe decalred Klasse

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]) 

und in kv ich es nur als

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

Aber nur auf dem ersten Feld funktioniert (es sieht nur Dateien, die auf die fallen gelassen werden " Bitte drop file1 "Feld, in anderen Fall erhält es einen Tropfen, aber nicht zu bestätigen, dass es in Grenzen des zweiten Feldes ist, als ob es nur die on_dropfile Funktion des ersten Objekts bindet.

Gibt es eine elegante Möglichkeit, es für mehrere Objekte zu implementieren?

Antwort

0

Jetzt macht es mehr Sinn für mich. In diesem Fall, warum machst du nicht einfach eine Liste und führst die Funktion aus, die du magst unter 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() 

Scheint mir ziemlich gut zu arbeiten. Ausnahmen mit Window beziehen sich direkt auf on_dropfile Handle in der App-Klasse, die andere in ihren entsprechenden Funktionen.

+0

Danke für die Antwort. Ich weiß, wie Klassen funktionieren. Helfer ist nur ein leerer 'Klassenhelfer', um die Mausposition zu halten, ich habe die Zeile 'Window.bind (mouse_pos = lambda w, p: setattr (helper, 'mpos', p))' später zur Hauptklasse verschoben auf, so wird es nicht mehrfach ausgeführt. Und es funktioniert nicht wie 'on_release', weil' on_dropfile' ein Fenster-Event ist und leider kein Widget-Event und ich kann es nicht von kv binden, da es Exceptions auslöst. Ich bin zu PyQt umgezogen, da es besser für Desktop-Apps geeignet scheint (Kivy könnte sagen, es ist für alle, aber für mobile Geräte optimiert). Aber die Frage ist immer noch gültig – sanki

+0

@sanki Ich habe es bearbeitet, so dass es funktioniert – KeyWeeUsr

+0

Danke, für die neue Bearbeitung, das scheint viel besser zu funktionieren :-) – sanki