4

我正在基于Urwid 的 Horizo​​ntal Menu示例构建一个应用程序。我有一个项目,我想显示一些信息。我在下面有一个“确定”按钮,我希望它可以将菜单弹出回之前的状态,或者重新启动整个屏幕/循环。

在示例中,他们使用ExitMainLoop(),但我不想退出 - 我只想重新启动它。因此,我已将回调更改为不同的函数 - 但我所有的尝试要么什么都不做,要么让我的程序崩溃。

以下是相关位:

启动菜单:

if __name__ == "__main__":
    top = HorizontalBoxes()
    top.open_box(menu_top([]).menu)
    urwid.MainLoop(urwid.Filler(top, 'middle', 40), palette).run()

相关菜单类/功能。我的问题是 -does_nothing函数中有什么?

class Choice(urwid.WidgetWrap):
    def __init__(self, caption, pid):
        super(Choice, self).__init__(
            MenuButton(caption, partial(self.item_chosen,pid)))
        self.caption = caption

    def item_chosen(self, pid, button):
        if self.caption == (u"System status"):
            showSystemStatus()


def showSystemStatus():
    response = urwid.Text( "... some text ")
    done = MenuButton(u'OK', does_nothing)
    response_box = urwid.Filler(urwid.Pile([response,done]))
    top.open_box(urwid.AttrMap(response_box, 'options'))

def does_nothing(key):
    ????????????????????
    return
4

1 回答 1

3

我找到了解决办法!我不得不在HorizontalBoxes类中添加一个新方法。具体来说,close_box方法:

class HorizontalBoxes(urwid.Columns):
    def __init__(self):
        super(HorizontalBoxes, self).__init__([], dividechars=1)

    def open_box(self, box):
        if self.contents:
            del self.contents[self.focus_position + 1:]
        self.contents.append((urwid.AttrMap(box, 'options', focus_map),
            self.options('given', 40)))
        self.focus_position = len(self.contents) - 1

    def close_box(self):
        if self.contents:
            del self.contents[self.focus_position :]
            self.focus_position = len(self.contents) - 1

close_box然后,从我does_nothing之前的函数中调用方法很简单:

def does_nothing(key):
    top.close_box()
    return
于 2016-04-03T12:32:49.540 回答