【问题标题】:Keyboard Shortcut "Takes 1 positional argument but 2 were given"键盘快捷键“接受 1 个位置参数,但给出了 2 个”
【发布时间】:2017-11-01 11:17:44
【问题描述】:

尝试制作键盘快捷键来重置游戏。在 __init__ 类的早期,我创建了一个菜单来开始一个新游戏,并使用 self.reset 来重置分数/网格等。 我现在一直在尝试使用相同的命令来实现快捷方式 - 重置是类中的一个方法。

self._master.bind_all('<Control-n>', self.reset)

这是错误:

TypeError: reset() takes 1 positional argument but 2 were given

我的困惑是 self.reset 在 __init__ 早期工作正常,但不适用于快捷方式?

我看不到快捷方式如何为方法提供任何位置参数。

现在,如果我将其更改为 self.reset(),我会收到有关当前类缺少 _game 属性的错误。

这里是重置方法:

def reset(self):
    self._game.get_default_score()
    self._game.reset()
    self._grid_view.draw(self._game.grid, self._game.find_connections())

【问题讨论】:

  • 无法从代码中看出self._master 是什么!你能说出那是什么吗

标签: python tkinter keyboard shortcut


【解决方案1】:

这很简单 - 无论绑定快捷方式的机制如何,它都会将一个额外的参数传递给您的 reset 方法。

既然你根本不在乎它是什么,只需声明你的方法接受 一个额外的可选参数,你应该很好:

...
def reset(self, event=None):
    self._game.get_default_score()
    ...

所以,搜索“bind_all”,我们会发现您的代码实际上使用了 tkinter,而 tkinter 传递给您的方法的是“事件” - 一个包含实际按下的键等信息的对象 - http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

【讨论】:

  • 我认为如果您将extra 更改为event,您的示例会更好。即使可能不会使用,但在每个绑定中始终使用event 将使代码更易于理解。
  • (完成。实际上在确认它是 tkinter 之前我已经回答过了,额外的参数是“事件”——这个问题可以用“纯 Python”来回答)
  • 感谢您的建议和解释!我有一种感觉,它可能将 Ctrl+N 作为某种参数读取,因此它在另一个 /__init__ 命令中起作用。
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 2019-04-20
  • 2018-11-15
  • 2014-07-19
  • 2016-08-09
  • 2020-01-30
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多