【发布时间】:2017-03-27 23:16:49
【问题描述】:
所以我正在尝试构建一个小型井字游戏,并且我正在使用 kivy 来实现它。我遇到的问题是我制作了一个由 9 个按钮 (3x3) 组成的网格,现在我正在绑定它们(或尝试绑定它们)。
我在我的类 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 不接受任何参数,这可以正常工作,但是因为我希望它知道按下了哪个按钮,所以我想发送 i.这导致了一个问题,我还需要将 BoardGrid 传递给我在类中创建的回调函数?
也许我在这里从错误的角度攻击它,我认为我可以将我的按钮绑定到回调函数中的特定输入,但这可能是不可能的。
任何关于如何使绑定工作的建议将不胜感激
编辑:似乎现在正在工作,对不起,我无法回复所有人,这是我的第一篇文章,我似乎还不太明白,呵呵。非常感谢您的回复!
【问题讨论】:
-
首先,您有一个
BoardGrid实例self。如果任何实例是适当的,它可能就是那个。其次,这个回调实际上可能不需要是BoardGrid的方法。如果使用模块级函数对您来说不那么令人困惑,那就去吧。第三,BoardGrid.callback(...)不是回调,无论...中有什么内容;这就是说立即运行BoardGrid.callback,而不是将其作为回调传递。你需要functools.partial。 -
看来您需要另一个类,例如 Button,并在 init 中创建一个包含 9 个按钮的数组。
-
self.buttons[i].bind(on_press=lambda i=i: self.callback(i))可能有效,但我现在无法测试。 -
@Robᵩ 我认为
i=i增加了混乱,partial在这里更好。 -
所以当你说 Rob 工作时,但正如我在下面回复另一个人一样,它给我的 btn 不是我期望的整数,而是按钮对象
标签: python button kivy tic-tac-toe