2016-09-22 4 views
0

Я хочу изменить функцию, которая запускается при нажатии кнопки.Привязать кнопку уже on_press

файл Python:

class UpdateScreen(Screen): 

swimbot = {} 
def swimbot_connected(self): 
    wallouh = list(AdbCommands.Devices()) 
    if not wallouh: 
     self.ids['text_label'].text = 'Plug your Swimbot and try again' 
    else: 
     for devices in AdbCommands.Devices(): 
      output = devices.serial_number 
      if re.match("^(.*)swimbot", output): 
       self.ids['mylabel'].text = 'Etape 2: Do you need an update ?' 
       self.ids['action_button'].text = 'Check' 
       self.ids['action_button'].bind(on_press = self.check_need_update()) 
      else: 
       self.ids['text_label'].text = 'Plug your Swimbot and try again' 

Kv Файл:

<UpdateScreen>: 
BoxLayout: 
    id: update_screen_layout 
    orientation: 'vertical' 
    Label: 
     id: mylabel 
     text: "Etape 1: Connect your Swimbot" 
     font_size: 26 
    Label: 
     id: text_label 
     text: "Truc" 
     font_size: 24 
    FloatLayout: 
     size: root.size 
     pos: root.pos 
     Button: 
      id: action_button 
      pos_hint: {'x': .05, 'y':.25} 
      size_hint: (.9, .4) 
      text: "Try" 
      font_size: 24 
      on_press: root.swimbot_connected() 

Но я думаю, что это не правильный способ сделать это с этим:

self.ids['action_button'].bind(on_press = self.check_need_update()) 

С этими словами я иду прямо на check_need_update(), он не ждет, я нажимаю кнопку.

ответ

0

Когда вы положили () после функции в python, вы выполняете эту функцию. Поэтому, когда вы набираете

self.ids['action_button'].bind(on_press = self.check_need_update()) 

Вы фактически передать результат self.check_needed_update к on_press. Таким образом, вам необходимо:

self.ids['action_button'].bind(on_press = self.check_need_update) 

Это отличается на языке kv. Там вам нужно поставить () при привязке функции. Вы также можете указать там аргументы, которые будут оцениваться при вызове callback (а не при чтении определения).

Но код python на самом деле не будет делать то, что вы хотите. Он привяжет дополнительную функцию к этой кнопке, но не перезапишет другую функцию. Вы можете отменить обратные вызовы, но это немного сложно (см. the documentation here).

Вместо этого я хотел бы изменить вызываемую функцию таким образом, что он ведет себя по-разному:

class UpdateScreen(Screen): 

    state = 0 
    swimbot = {} 
    def swimbot_connected(self): 
     if state == 0: 
      self._original_swimbot_connected() 
     if state == 1: 
      self.check_need_update 

И тогда вместо развязывания и привязки новой функции к кнопке, вы можете просто изменить UpdateScreen.state.