【问题标题】:make child widget get the input keypress with urwid on python使子小部件在 python 上使用 urwid 获取输入按键
【发布时间】:2020-11-26 08:39:52
【问题描述】:

我可以在另一个小部件中创建一个小部件,例如 urwid.Frame 父亲可以将 bodyurwid.Pile 小部件作为孩子。 在这种情况下,当孩子必须处理一些特定的其他键时,父亲应该处理一些输入键。

就像在这个功能示例中一样:

import urwid


class NewFrame(urwid.Frame):
    def __init__(self, givenBody):
        super().__init__(urwid.Filler(givenBody, "top"))

    def keypress(self, size, key):
        if key  in ('f'):
            print("We are in NewFrame object")

        return super(NewFrame, self).keypress(size, key)


class NewPile(urwid.Pile):
    def __init__(self, givenList):
        super().__init__(givenList)

    def keypress(self, size, key):
        if key  in ('p'):
            print("We are in NewPile object")

        return super(NewPile, self).keypress(size, key)



master_pile = NewPile([
    urwid.Text("foo"),
    urwid.Divider(u'─'),
])


frame = NewFrame(master_pile)

loop = urwid.MainLoop(frame)
loop.run()

当我按下 f 时,我可以看到 Text 小部件“我们在 NewFrame 中”。但是当我按下 p 时,NewPile 文本没有出现并且没有任何反应。

那么,我怎样才能让子小部件获得输入键,尤其是当它们与父级的 .keypress() 方法不匹配时?

【问题讨论】:

    标签: python widget keypress urwid


    【解决方案1】:

    在NewFrame的keypress()方法中调用master_pile.keypress(),如下:

    def keypress(self, size, key):
        if key  in ('f'):
            print("We are in NewFrame object")
    
        #return super(NewFrame, self).keypress(size, key)
        master_pile.keypress(size, key)
    

    【讨论】:

    • 但无论如何sizemaster_pile 来说是错误的,对吧?如果这种方式存在的话,这似乎不是“正确”的方式......
    【解决方案2】:

    从我可以从文档 (http://urwid.org/manual/widgets.html#pile-widgets) 中读到的内容来看,只有当 Pile 小部件包含另一个可选小部件(在您的示例中没有)时,它才是可选的。

    您应该能够通过覆盖selectable() 来覆盖子类中的此行为,使其始终可选择。

    我认为当小部件不可选择时,Urwid 永远不会调用keypress,因为小部件仅在可选时才需要实现keypress (http://urwid.org/reference/widget.html#urwid.Widget.selectable)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多