2017-03-27 11 views
-1

私はチックタックのつま先の小さなゲームを構築しようとしています、そして、私はそれを実現させるためにkivyを使用しています。私が遭遇する問題は、私は9つのボタン(3x3)のグリッドを作って、今私はそれらをバインドしている(またはしようとしている)ということです。そのクラスの__init __()メソッド内でクラスのメソッドを使用する

これは私のクラスBoardGridの__init__メソッドの中で、これはプログラムが最初に実行されたときにしか起こらないので、これをすべて行います。

class BoardGrid(GridLayout): 
    def __init__(self, **kwargs): 
     super(BoardGrid, self).__init__(**kwargs) 
     self.board = [] 
     self.buttons = [] 
     for i in range(9): 
      self.board.append('') 
      self.buttons.append(Button(text=self.board[i])) 
      self.buttons[i].bind(on_press=BoardGrid.callback(????, i)) 
      self.add_widget(self.buttons[i]) 

    def callback(self, btn): 
     print(btn) 

問題はon_pressは、それが指示する機能を取り、私はBoardGrid.callbackは引数を取りません許可すれば、これは正常に動作していることですが、私はそれがどのボタンが押されたかを知りたいので、私が送信したいです私はこれは、クラス内で作成したコールバック関数にBoardGridを渡す必要があるという問題につながります。

私はこれを間違った角度から攻撃しているかもしれませんが、コールバック関数の特定の入力にボタンをバインドできると思っていましたが、それは不可能かもしれません。

バインディングが動作するように取得する方法上の任意のアドバイスはあまり

EDITをいただければ幸いです。私はすべての人に返信をcouldntの申し訳ありませんが、今で動作しているようだ、それは私の最初のポストだと私はかなり理解して見えることはできませんそれはまだhehe。返信をありがとう!

+0

まず、 'BoardGrid'インスタンス' self'があります。インスタンスが適切であれば、それはおそらくそのインスタンスです。第2に、このコールバックは実際には 'BoardGrid'のメソッドである必要はないかもしれません。モジュールレベルの関数を使用することをあまり混乱させない場合は、それを実行してください。第3に、 'BoardGrid.callback(...)'は '... 'に何が入ってもコールバックではありません。これは 'BoardGrid.callback'をすぐに実行し、コールバックとして渡さないということです。 'functools.partial'が必要です。 – user2357112

+0

別のクラス、たとえばButtonが必要と思われ、__init__に9個のボタンの配列を作成します。 – Shiping

+0

'self.buttons [i] .bind(on_press = lambda i = i:self.callback(i))'は動作するかもしれませんが、今はテストできません。 –

答えて

1
from functools import partial 

class BoardGrid(GridLayout): 
    def __init__(self, **kwargs): 
     ... 
      self.buttons[i].bind(on_press=partial(self.callback, i)) 
      ... 

    def callback(self, btn): 
     print(btn) 
+2

これはなぜ答えであるのか本当に詳しく述べるべきです。 – Carcigenicate

関連する問題