Python Urwid中的Keypress函数

时间:2018-01-30 22:38:40

标签: 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)在QuestionBox类之外没有调用Keypress函数。即使没有调用函数,为什么它会被执行?

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

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

提前致谢

1 个答案:

答案 0 :(得分:1)

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

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