2017-03-27 59 views
-1

所以我正在嘗試構建一個tic tac腳趾的小遊戲,並且我正在使用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傳遞到我在課堂中創建的回調函數中?

也許我在這裏從錯誤的角度來攻擊它,我想我可以將我的按鈕綁定到回調函數中的特定輸入,但這可能是不可能的。

如何獲得綁定工作有什麼意見,將不勝感激

編輯:似乎是現在的工作,對不起,我不能回覆大家,這是我的第一篇文章,我不能完全似乎明白了它還沒有。非常感謝回覆!

+0

首先,你有一個'BoardGrid'實例,'self'。如果有任何實例是合適的,那可能就是那一個。其次,這個回調可能實際上並不需要成爲'BoardGrid'的一種方法。如果您對使用模塊級功能不那麼困惑,那就去做吧。第三,無論''...'中發生了什麼,'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

相關問題