gpt4 book ai didi

python - urwid:使光标不可见

转载 作者:IT王子 更新时间:2023-10-29 00:47:59 27 4
gpt4 key购买 nike

我正在使用 urwid,这是一个用于在 ncurses 中设计终端用户界面的 Python“框架”。不过有一件事我不能在 urwid 中做,而这在 curses 中很容易——使光标不可见。就像现在一样,选择按钮时光标是可见的,而且看起来很丑陋。有没有办法禁用它?

最佳答案

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

这是它在我的项目中的样子。

enter image description here

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 类,并让它在被点击时发出信号。

要使按钮在用户移动时反转,将其包装到 AttrMap 并将 focus_map 设置为某个调色板条目(“button_reversed”,以我为例)。

关于python - urwid:使光标不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34633447/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com