2016-07-27 2 views
0

Можно ли связать on_dropfile в нескольких объектах? Или это всегда одна привязка?kivy on_dropfile несколько привязок

Я decalred класс

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

и в кв я просто использовать его как

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

Но работает только на первом поле (он видит только файлы, которые отбрасываются на " Please drop file1 ", в другом случае он получает падение, но не может признать, что он находится в границах второго поля, как будто он связывает только функцию on_dropfile первого объекта).

Есть ли элегантный способ реализовать его для нескольких объектов?

ответ

0

Теперь это имеет для меня больше смысла. В этом случае, почему бы вам просто не составить список и выполнить любую функцию, которая вам нравится, на 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, другие - в соответствующих функциях.

+0

Спасибо за ответ. Я знаю, как работают классы. Помощник - это просто пустой помощник класса, чтобы удерживать позицию мыши, я переместил строку 'Window.bind (mouse_pos = lambda w, p: setattr (helper, 'mpos', p))' к основному классу позже on, поэтому он не выполняется несколько раз. И это не работает как 'on_release', потому что' on_dropfile' - событие окна, а не событие виджета, к сожалению, и я не могу связать его с kv, поскольку он генерирует исключения. Я перешел в PyQt, поскольку он кажется более подходящим для настольных приложений (Киви может сказать, что это для всех, но оптимизирован для мобильных устройств). Но вопрос остается в силе – sanki

+0

@sanki Я его отредактировал, так что он работал – KeyWeeUsr

+0

Спасибо, за новое редактирование, похоже, работает намного лучше :-) – sanki

Смежные вопросы