【问题标题】:Using method of a class within the __init__() method of that class在该类的 __init__() 方法中使用该类的方法
【发布时间】: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


【解决方案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)

【讨论】:

  • 你应该详细说明为什么这是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多