2016-07-04 3 views
2

Я пытаюсь использовать один и тот же обратный вызов для нескольких кнопок, мне нужно что-то, возвращающее логическое значение для использования обратного вызова, как это сделано здесь, но я не мог найти что-то вроде этого. Есть ли способ сделать это без привязки к каждой кнопке другой функции?Тот же ответ на несколько кнопок в kivy

import kivy 
from kivy.app import App 
from kivy.uix.screenmanager import Screen 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 

kivy.require('1.9.2') 


class VelhaGame(GridLayout, Screen): 
    def __init__(self, **kwargs): 
     super(VelhaGame, self).__init__(**kwargs) 
     self.cols = 3 
     self.rows = 3 
     self.font_size = 100 

     self.button1 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button1) 
     self.button1.bind(on_press=self.player_turn) 

     self.button2 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button2) 
     self.button2.bind(on_release=self.player_turn) 

     self.button3 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button3) 
     self.button3.bind(on_release=self.player_turn) 

     self.button4 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button4) 
     self.button4.bind(on_release=self.player_turn) 

     self.button5 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button5) 
     self.button5.bind(on_release=self.player_turn) 

     self.button6 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button6) 
     self.button6.bind(on_release=self.player_turn) 

     self.button7 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button7) 
     self.button7.bind(on_release=self.player_turn) 

     self.button8 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button8) 
     self.button8.bind(on_release=self.player_turn) 

     self.button9 = Button(text='', font_size=self.font_size) 
     self.add_widget(self.button9) 
     self.button9.bind(on_release=self.player_turn) 

     self.player1 = True 

    def player_turn(self, *args): 
     if self.player1: 
      self.player1 = False 
      if self.button1: 
       self.button1.text = 'X' 
      elif self.button2: 
       self.button2.text = 'X' 
      elif self.button3: 
       self.button3.text = 'X' 
      elif self.button4: 
       self.button4.text = 'X' 
      elif self.button5: 
       self.button5.text = 'X' 
      elif self.button6: 
       self.button6.text = 'X' 
      elif self.button7: 
       self.button7.text = 'X' 
      elif self.button8: 
       self.button8.text = 'X' 
      elif self.button9: 
       self.button9.text = 'X' 
     elif not self.player1: 
      self.player1 = True 
      if self.button1: 
       self.button1.text = 'O' 
      elif self.button2: 
       self.button2.text = 'O' 
      elif self.button3: 
       self.button3.text = 'O' 
      elif self.button4: 
       self.button4.text = 'O' 
      elif self.button5: 
       self.button5.text = 'O' 
      elif self.button6: 
       self.button6.text = 'O' 
      elif self.button7: 
       self.button7.text = 'O' 
      elif self.button8: 
       self.button8.text = 'O' 
      elif self.button9: 
       self.button9.text = 'O' 


class VelhaGameApp(App): 
    def build(self): 
     game = Screen() 
     table_screen = VelhaGame() 
     game.add_widget(table_screen) 
     return game 

if __name__ == '__main__': 
    VelhaGameApp().run() 

ответ

4

Если вы видите, что повторяете свой код, это часто означает, что вам нужен цикл. Также метод, который вы связываете, получает в качестве первого аргумента экземпляр кнопки, которая вызвала его.

import kivy 
from kivy.app import App 
from kivy.uix.screenmanager import Screen 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 


class VelhaGame(GridLayout, Screen): 
    def __init__(self, **kwargs): 
     super(VelhaGame, self).__init__(**kwargs) 
     self.cols = 3 
     self.rows = 3 
     self.font_size = 100 

     self.buttons = [] 

     for i in range(1, 10): 
      button = Button(text='', font_size=self.font_size) 
      button.bind(on_press=self.player_turn) 
      self.add_widget(button) 
      self.buttons.append(button) 

     self.player1 = True 

    def player_turn(self, instance, *args): 
     if self.player1: 
      self.player1 = False 
      instance.text = 'X' 
     elif not self.player1: 
      self.player1 = True 
      instance.text = '0' 

class VelhaGameApp(App): 
    def build(self): 
     game = Screen() 
     table_screen = VelhaGame() 
     game.add_widget(table_screen) 
     return game 

if __name__ == '__main__': 
    VelhaGameApp().run() 

Вы также можете создать подкласс Button класса, но это было бы излишним здесь.

+0

Это было действительно полезно для меня, я не знаю, как это сделать надолго до сих пор. Я не привык использовать цикл for так, спасибо за ваш совет. –

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