Urwid:使光标不可见

我正在使用urwid,这是一个Python框架,用于在ncurses中deviseterminal用户界面。 有一件事,虽然我不能在诅咒中很容易做到这一点 – 使光标不可见。 就像现在,selectbutton时光标是可见的,而且看起来很丑陋。 有没有办法禁用它?

urwid使用curs_set函数,但不会将其作为任何类的方法公开。 有人可以修改urwid来允许使用这种方法; 否则没有可靠的方法来做到这一点。

您可能会将其报告为问题 。

我同意在urwid.Button上闪烁的光标看起来有点跛脚,所以我想出了一个解决方案来隐藏它。 在urwid中, Button类只是WidgetWrap一个子类, WidgetWrap包含一个SelectableIcon和两个Text小部件(包含“<”和“>”)。 这是SelectableIcon类,默认情况下,它将光标位置设置为标签的第一个字符。 通过urwid.WidgetWrap SelectableIcon ,修改光标位置,然后将其包装到一个urwid.WidgetWrap子类中,您可以创建自己的自定义按钮,可以执行所有的技巧内置Button ,甚至更多。

这里是我的项目中的样子。

在这里输入图像描述

 import urwid class ButtonLabel(urwid.SelectableIcon): def __init__(self, text): """ Here's the trick: we move the cursor out to the right of the label/text, so it doesn't show """ curs_pos = len(text) + 1 urwid.SelectableIcon.__init__(self, text, cursor_position=curs_pos) 

接下来,您可以将WidgetWrap对象与其他任何对象一起包装到WidgetWrap子类中,该子类将成为您的自定义按钮类。

 class FixedButton(urwid.WidgetWrap): _selectable = True signals = ["click"] def __init__(self, label): self.label = ButtonLabel(label) # you could combine the ButtonLabel object with other widgets here display_widget = self.label urwid.WidgetWrap.__init__(self, urwid.AttrMap(display_widget, None, focus_map="button_reversed")) def keypress(self, size, key): """ catch all the keys you want to handle here and emit the click signal along with any data """ pass def set_label(self, new_label): # we can set the label at run time, if necessary self.label.set_text(str(new_label)) def mouse_event(self, size, event, button, col, row, focus): """ handle any mouse events here and emit the click signal along with any data """ pass 

在这个代码中,在FixedButton WidgetWrap子类中实际上并没有太多的组件,但是你可以在按钮的边上添加一个“ [ ”和“ ] ”,把它包装到一个LineBox等等。如果这些都是多余的,您可以将事件处理函数移到ButtonLabel类中,并在被点击时发出一个信号。

为了让用户在其上移动按钮,将其转换为AttrMap ,并将focus_map设置为一些调色板条目(在我的情况下为“ button_reversed ”)。

沿着“醉拳”的回答,而是用“微创手术”:

 class ButtonLabel(urwid.SelectableIcon): ''' use Drunken Master's trick to move the cursor out of view ''' def set_text(self, label): ''' set_text is invoked by Button.set_label ''' self.__super.set_text(label) self._cursor_position = len(label) + 1 class MyButton(urwid.Button): ''' - override __init__ to use our ButtonLabel instead of urwid.SelectableIcon - make button_left and button_right plain strings and variable width - any string, including an empty string, can be set and displayed - otherwise, we leave Button behaviour unchanged ''' button_left = "[" button_right = "]" def __init__(self, label, on_press=None, user_data=None): self._label = ButtonLabel("") cols = urwid.Columns([ ('fixed', len(self.button_left), urwid.Text(self.button_left)), self._label, ('fixed', len(self.button_right), urwid.Text(self.button_right))], dividechars=1) super(urwid.Button, self).__init__(cols) if on_press: urwid.connect_signal(self, 'click', on_press, user_data) self.set_label(label) 

在这里,我们只修改按钮的外观,否则保持其行为不变。