【发布时间】:2019-09-09 01:13:47
【问题描述】:
如果有人熟悉 urwid 库,我可以使用它。下面有两个代码 sn-ps,第一个是从 urwid 文档中复制的工作示例,第二个是我将文档中的一些不同示例合在一起的结果。
我的主要问题是应该在“点击”事件上运行的 item_chosen 函数,即按下回车,似乎没有在第二个版本中运行
除了文档之外,很难找到许多 urwid 资源,而且我使用它的时间还不够长,无法完全理解他们的小部件模型,如果这有点微不足道或显而易见,我深表歉意。
这是一个从 urwid 文档复制的工作示例。
import urwid
choices = u'Chapman Cleese Gilliam Idle Jones Palin'.split()
def menu(title, choices):
body = [urwid.Text(title), urwid.Divider()]
for c in choices:
button = urwid.Button(c)
urwid.connect_signal(button, 'click', item_chosen, c)
body.append(urwid.AttrMap(button, None, focus_map='reversed'))
return urwid.ListBox(urwid.SimpleFocusListWalker(body))
def item_chosen(button, choice):
response = urwid.Text([u'You chose ', choice, u'\n'])
done = urwid.Button(u'Ok')
urwid.connect_signal(done, 'click', exit_program)
main.original_widget = urwid.Filler(urwid.Pile([response,
urwid.AttrMap(done, None, focus_map='reversed')]))
def exit_program(button):
raise urwid.ExitMainLoop()
main = urwid.Padding(menu(u'Pythons', choices), left=2, right=2)
top = urwid.Overlay(main, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
align='center', width=('relative', 60),
valign='middle', height=('relative', 60),
min_width=20, min_height=9)
urwid.MainLoop(top, palette=[('reversed', 'standout', '')]).run()
我尝试将它重构为一个类,但成功率参差不齐。
class Menu:
def __init__(self,title,choices):
pad = urwid.Padding(self.make(title, choices), left=2, right=2)
self.main = urwid.Overlay(pad, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
align='center', width=('relative', 60),
valign='middle', height=('relative', 60),
min_width=20, min_height=9)
def make(self,title,choices):
body = [urwid.Text(title), urwid.Divider()]
for c in choices:
button = urwid.Button(c)
urwid.connect_signal(button, 'click', self.item_chosen, c)
body.append(urwid.AttrMap(button, None, focus_map='reversed'))
return urwid.ListBox(urwid.SimpleFocusListWalker(body))
def item_chosen(self, button, choice):
response = urwid.Text([u'You chose ', choice, u'\n'])
done = urwid.Button(u'Ok')
urwid.connect_signal(done, 'click', exit_program)
self.main.original_widget = urwid.Filler(urwid.Pile([response,
urwid.AttrMap(done, None, focus_map='reversed')]))
我的完整代码在这里:https://pastebin.com/bv4eubiy
如上所述,如果您运行第二个代码,您会注意到,显示您选择的对话框不会出现,我不知道为什么。
【问题讨论】: