0

如果这不是一个好问题,请原谅我。我很难理解 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 功能以击键作为输入。我无法理解在哪一行代码中,击键被分配给“键”变量。第7行直接使用,不做任何初始化

    if key != 'enter':

这怎么可能?

2) Keypress 函数尚未在 QuestionBox 类之外调用。即使没有调用该函数,为什么它会被执行?

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

4) 'keypress' 功能中的 'size' 字段是什么?

提前致谢

4

1 回答 1

1
  1. key是一个参数,因此很可能调用该函数的人正在将最近按下的键传递给它。
  2. 由于您已传递fillurwid.MainLoop,并且QuestionBox是从名为 的 urwid 类继承的Filler,因此可能的解释是MainLoop使用适当的参数调用函数。根据文档(您的链接):“在QuestionBox.keypress()除 ENTER 之外的所有按键中,都传递给Filler.keypress()将它们发送到子Edit.keypress()方法的默认值。”
  3. 如果在 Python 的子类中未指定构造函数,则自动调用基类构造函数。因此,既不需要init也不super需要。
  4. 至于 size 参数,文档不太清楚它是什么,但进一步看应该会找到答案。

#4 的更新:

size是小部件的大小,尽管我不确定它的用途。

于 2018-01-30T22:54:50.327 回答