Python Urwid 中的按键功能

Keypress Function in Python Urwid

如果这不是一个好问题,请原谅我。我很难理解 Python 中 URWID 库中的代码之一。这是教程中的示例代码之一。 http://urwid.org/tutorial/index.html

 1 import urwid

 2 def exit_on_q(key):
 3   if key in ('q', 'Q'):
 4     raise urwid.ExitMainLoop()

 5  class QuestionBox(urwid.Filler):
 6    def keypress(self, size, key):
 7      if key != 'enter':
 8        return super(QuestionBox, self).keypress(size, key)
 9      self.original_widget = urwid.Text(
 10       u"Nice to meet you,\n%s.\n\nPress Q to exit." %
 11       edit.edit_text)

 12  edit = urwid.Edit(u"What is your name?\n")
 13  fill = QuestionBox(edit)
 14  loop = urwid.MainLoop(fill, unhandled_input=exit_on_q)
 15  loop.run()

我的问题是

1) Keypress 函数以击键作为输入。我不明白在哪一行代码中,击键被分配给 'key' 变量。第7行不做任何初始化直接使用

    if key != 'enter':

这怎么可能?

2) 尚未在问题框外调用按键功能 class。即使不调用该函数,为什么它会被执行?

3) 新的 class QuestionBox 中没有定义 init 函数。为什么不需要?我相信它应该在 class 定义中同时具有 initsuper

4) 'keypress' 函数中的 'size' 字段是什么?

提前致谢

  1. key 是一个参数,因此调用该函数的人很可能将最近按下的键传递给它。
  2. 由于您已将 fill 传递给 urwid.MainLoop,并且 QuestionBox 继承自名为 Filler 的 urwid class,可能的解释是 MainLoop 正在调用带有适当参数的函数。根据文档(您的 link):"In QuestionBox.keypress() all keypresses except ENTER are passed along to the default Filler.keypress() which sends them to the child Edit.keypress() method."
  3. 如果在 Python 中的子 class 中未指定构造函数,则会自动调用基础 class 构造函数。因此,既不需要 init 也不需要 super
  4. 至于大小参数,文档中并不清楚它是什么,但进一步查看应该会找到答案。

#4 的更新:

size 是小部件的大小,虽然我不确定它的用途是什么。