从ListBox中选择项目并提取内容(urwid)

4
我正在使用urwid制作一个ListBox,其中每个项目都是从URL列表中提取的URL。 当选择一个项目并点击ENTER时,我想提取URL并在浏览器中打开它。以下是我的代码:
class SelectableText(urwid.Text):
    def selectable(self):
        return True

    def keypress(self, size, key):
        return key

def handle_input(input):
    if input == "": # Open link
        focus_widget, idx = content_container.get_focus()
        # TODO: Open link from focus_widget
    elif input in ('q', 'Q'): # Quit
        raise urwid.ExitMainLoop()

palette = [
  ('menu', 'black', 'dark cyan', 'standout'),
  ('reveal focus', 'black', 'dark cyan', 'standout')]
menu = urwid.Text([
    u'\n',
    ('menu', u' ENTER '), ('light gray', u" Open link "),
    ('menu', u' Q '), ('light gray', u" Quit"),
])

list_of_urls = ["http://thisisalink.com/", ...]
items = list(map(lambda url: urwid.AttrMap(SelectableText(url), None, "reveal focus"), list_of_urls))
content = urwid.SimpleListWalker(items)
content_container = urwid.ListBox(content)

layout = urwid.Frame(body=content_container, footer=menu)

main_loop = urwid.MainLoop(layout, palette, unhandled_input=handle_input)
main_loop.run()

问题出在handle_input(input)函数中。我该如何从content_container.get_focus()的结果中提取实际的URL?
1个回答

3

focus_widget是一个AttrMap对象,它包装了文本小部件。

您可以使用urwid.Text小部件的.text属性获取文本内容,并且您可以使用.base_widget属性获取由urwid.AttrMap包装的小部件。

还需要注意检查输入是否等于enter以检查Enter键。

def handle_input(input):
    if input == "enter": # Open link
        focus_widget, idx = content_container.get_focus()
        url = focus_widget.base_widget.text
        import webbrowser
        webbrowser.open(url)
    elif input in ('q', 'Q'): # Quit
        raise urwid.ExitMainLoop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接