Urwid: сделать курсор невидимым

Я использую urwid, который является «каркасом» Python для проектирования пользовательских интерфейсов терминала в ncurses. Есть одна вещь, хотя я не могу сделать это в urwid, что было легко в проклятиях – сделать курсор невидимым. Как сейчас, курсор отображается при выборе кнопок, и он выглядит просто некрасиво. Есть ли способ отключить его?

3 Solutions collect form web for “Urwid: сделать курсор невидимым”

urwid использует функцию curs_set , но не раскрывает ее как метод класса в любом месте. Кто-то может изменить urwid, чтобы позволить использовать этот метод; в противном случае нет надежного способа сделать это.

Вы можете сообщить об этом как о проблеме .

Я согласен, что мигающий курсор на urwid.Button выглядит немного хромым, поэтому я придумал решение, чтобы скрыть его. В urwid класс Button является всего лишь подклассом WidgetWrap содержащим SelectableIcon и два текстовых виджета (включая «<» и «>»). Это класс SelectableIcon который по умолчанию устанавливает позицию курсора на первый символ метки. Подклассифицируя 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) 

Затем вы можете обернуть объект ButtonLabel вместе с любыми другими объектами в подкласс 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 и заставить его 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) 

Здесь мы изменяем внешний вид кнопки, но в остальном ее поведение остается неизменным.

Python - лучший язык программирования в мире.