Urwid 水平菜单 - return 到上一个状态或重新开始循环
Urwid horizontal menu - return to previous state or restart loop
我正在基于 Urwid 的 Horizontal Menu 示例构建应用程序。
我有一个项目,我想显示一些信息。我下面有一个 "OK" 按钮,我希望它可以将菜单弹出回到之前的状态,或者重新启动整个 screen/loop.
在示例中,他们使用 ExitMainLoop()
,但我不想退出 - 我只想重新启动它。
因此,我已将回调更改为不同的函数 - 但我所有的尝试要么什么都不做,要么使我的程序崩溃。
这里是相关位:
启动菜单:
if __name__ == "__main__":
top = HorizontalBoxes()
top.open_box(menu_top([]).menu)
urwid.MainLoop(urwid.Filler(top, 'middle', 40), palette).run()
相关菜单class/functions。 我的问题是 - 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
我找到了解决办法!
我不得不向 HorizontalBoxes
class 添加一个新方法。具体来说,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
然后,从我之前的 does_nothing
函数调用 close_box
方法很简单:
def does_nothing(key):
top.close_box()
return
我正在基于 Urwid 的 Horizontal Menu 示例构建应用程序。 我有一个项目,我想显示一些信息。我下面有一个 "OK" 按钮,我希望它可以将菜单弹出回到之前的状态,或者重新启动整个 screen/loop.
在示例中,他们使用 ExitMainLoop()
,但我不想退出 - 我只想重新启动它。
因此,我已将回调更改为不同的函数 - 但我所有的尝试要么什么都不做,要么使我的程序崩溃。
这里是相关位:
启动菜单:
if __name__ == "__main__":
top = HorizontalBoxes()
top.open_box(menu_top([]).menu)
urwid.MainLoop(urwid.Filler(top, 'middle', 40), palette).run()
相关菜单class/functions。 我的问题是 - 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
我找到了解决办法!
我不得不向 HorizontalBoxes
class 添加一个新方法。具体来说,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
然后,从我之前的 does_nothing
函数调用 close_box
方法很简单:
def does_nothing(key):
top.close_box()
return