在python上使用urwid使子窗口小部件获得输入按键

在python上使用urwid使子窗口小部件获得输入按键,python,widget,keypress,urwid,Python,Widget,Keypress,Urwid,我可以在另一个小部件中创建一个小部件,例如urwid.Frame父部件可以作为body子部件作为urwid.Pile小部件。 在这种情况下,当孩子必须处理一些特定的其他键时,父亲应该处理一些输入键 如本功能示例中所示: import urwid class NewFrame(urwid.Frame): def __init__(self, givenBody): super().__init__(urwid.Filler(givenBody, "top&qu

我可以在另一个小部件中创建一个小部件,例如
urwid.Frame
父部件可以作为
body
子部件作为
urwid.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键时,我可以看到
文本
小部件“我们在新框架中”。但是当我按p时,
NewPile
文本不会出现,也不会发生任何事情

那么,我如何才能使子小部件获得输入键,特别是当它们没有被父部件的
.keypress()
方法匹配时?

在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)
在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)

从文档()中我可以看到,一个Pile小部件只有在包含另一个可选择的小部件时才是可选择的(在您的示例中没有)

您应该能够在子类中重写此行为,方法是重写
selectible()
,使其始终可选


我认为Urwid永远不会在小部件不可选择时调用
keypress
,因为小部件只需要在小部件可选择时实现
keypress

根据我从文档中读取的内容()一个堆小部件只有在包含另一个可选择的小部件时才可选择(在您的示例中没有)

您应该能够在子类中重写此行为,方法是重写
selectible()
,使其始终可选


我认为Urwid永远不会在小部件不可选择时调用
keypress
,因为小部件只需要在小部件可选择时实现
keypress

但是在任何情况下
size
对于
master\u pile
都是错误的,对吗?这似乎不是一种“正确”的方法,如果这种方法曾经存在的话……但是在任何情况下,
size
对于
master\u pile
都是错误的,对吗?这似乎不是一种“正确”的方式,如果这种方式曾经存在的话。。。