我在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()
的结果中提取实际网址?
答案 0 :(得分:1)
在focus_widget
中,您有AttrMap对象包装文本小部件。
您可以使用urwid.Text
属性从.text
窗口小部件中获取文本内容,并且可以使用urwid.AttrMap
属性将.base_widget
包裹的窗口小部件。< / p>
另请注意,您需要检查输入是否等于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()