2024-06-07 18:06:16 发布
网友
urwid中按钮的默认外观非常实用,但在我看来不是很漂亮。 当几个按钮并排排列时,也会令人恼火。在
我怎样才能实现按钮以边框和居中文本显示,并在获得焦点时更改其颜色?在
您可以使用Urwid绘制任何在终端中可绘制的纯Unicode文本,并为每个字符指定前景色和背景色。在
考虑到这一点,不可能绘制出与模型中完全相同的图形,因为要绘制边框,您需要使用the Unicode box drawing characters,这将占用更多空间。在
我开始写一个例子,可惜现在没有时间润色。在
我在这里分享它未完成的状态(工作,但仍然很难看),希望你能发现它有用,也许可以作为一个很好的起点,让你摆弄:
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function, absolute_import, division import urwid PALETTE = [ ('normal', '', ''), ('bold', 'bold', ''), ('blue', 'bold', 'dark blue'), ('highlight', 'black', 'dark blue'), ] def show_or_exit(key): if key in ('q', 'Q', 'esc'): raise urwid.ExitMainLoop() class CustomButton(urwid.Button): button_left = urwid.Text('[') button_right = urwid.Text(']') def custom_button(*args, **kwargs): b = CustomButton(*args, **kwargs) b = urwid.AttrMap(b, '', 'highlight') b = urwid.Padding(b, left=4, right=4) return b class BoxButton(urwid.WidgetWrap): _border_char = u'─' def __init__(self, label, on_press=None, user_data=None): padding_size = 2 border = self._border_char * (len(label) + padding_size * 2) cursor_position = len(border) + padding_size self.top = u'┌' + border + u'┐\n' self.middle = u'│ ' + label + u' │\n' self.bottom = u'└' + border + u'┘' # self.widget = urwid.Text([self.top, self.middle, self.bottom]) self.widget = urwid.Pile([ urwid.Text(self.top[:-1]), urwid.Text(self.middle[:-1]), urwid.Text(self.bottom), ]) self.widget = urwid.AttrMap(self.widget, '', 'highlight') # self.widget = urwid.Padding(self.widget, 'center') # self.widget = urwid.Filler(self.widget) # here is a lil hack: use a hidden button for evt handling self._hidden_btn = urwid.Button('hidden %s' % label, on_press, user_data) super(BoxButton, self).__init__(self.widget) def selectable(self): return True def keypress(self, *args, **kw): return self._hidden_btn.keypress(*args, **kw) def mouse_event(self, *args, **kw): return self._hidden_btn.mouse_event(*args, **kw) if __name__ == '__main__': header = urwid.Text('Header') footer = urwid.Text('Footer') onclick = lambda w: footer.set_text('clicked: %r' % w) widget = urwid.Pile([ header, urwid.Text('Simple custom buttons:'), urwid.Columns([ custom_button('OK', on_press=onclick), custom_button('Cancel', on_press=onclick), ]), urwid.Text('Box bordered buttons:'), urwid.Columns([ urwid.Padding(BoxButton('OK', on_press=onclick), left=4, right=4), BoxButton('Cancel', on_press=onclick), ]), footer, ]) widget = urwid.Filler(widget, 'top') loop = urwid.MainLoop(widget, PALETTE, unhandled_input=show_or_exit) loop.run()
您可以使用Urwid绘制任何在终端中可绘制的纯Unicode文本,并为每个字符指定前景色和背景色。在
考虑到这一点,不可能绘制出与模型中完全相同的图形,因为要绘制边框,您需要使用the Unicode box drawing characters,这将占用更多空间。在
我开始写一个例子,可惜现在没有时间润色。在
我在这里分享它未完成的状态(工作,但仍然很难看),希望你能发现它有用,也许可以作为一个很好的起点,让你摆弄:
相关问题 更多 >
编程相关推荐