2017-03-27 28 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

相关问题