【问题标题】:Highlighting and Selecting text with Python curses使用 Python curses 突出显示和选择文本
【发布时间】:2011-07-24 15:44:49
【问题描述】:

这是我关于堆栈溢出的第一篇文章。多年来,我一直在这个网站上寻找信息,它总是很有帮助,所以我想我会发布我的第一个问题。

我一直在寻找一些类似的例子,但似乎找不到任何东西。

最终,我正在尝试编写一个简单的文本 ui,用于在文本提取程序中查找误报和误报。误报模块是一个简单的是/否选择,显示彩色文本和使用 getch() 很容易。然而,假阴性部分变得越来越困难。

所以这就是我想做的:

  1. 在屏幕上显示一个字符串(暂时忘记滚动......呃)它只会是一个没有换行符的字符串。
  2. 用户看到文本,然后按“h”进入突出显示模式。
  3. 然后,用户可以控制光标将其移动到文本的一部分(仍显示)上,然后选择“v”开始突出显示(我试图使其尽可能接近 vi)
  4. 然后用户使用控制键(箭头,hjkl)将光标从起点移动到终点,并在途中突出显示文本。这个突出显示的部分应该是一个误报
  5. 用户按下某个键(可能是“y”),选定的文本被着色或保持突出显示,突出显示的文本被保存到稍后我将处理的某个变量中。
  6. 用户退出突出显示模式并继续。

有什么想法可以开始吗?我正在尝试简单的事情,例如在屏幕上保留文本并移动光标,但无济于事。

我知道 curses.textpad.TextBox() 模块,但它执行插入和删除等编辑,我不想这样做。也许有一种方法可以禁用它。

我还有其他问题,但现在我会保持具体。

谢谢!!

尼尔

编辑:更具体地说,我不是在寻找编写整个程序的帮助,只是帮助将光标移动到显示的文本上,突出显示它,然后选择它并将其保存在变量中。

【问题讨论】:

    标签: python ncurses tui


    【解决方案1】:

    我想更新这个问题,以防其他人在网上搜索这个问题并偶然发现这个问题。

    好的,所以答案实际上很简单,需要阅读 python curses 文档中列出的所有函数。

    我做了一个 3 状态机:状态 1:正常模式(仅显示文本),状态 2:高亮模式,允许光标在窗口中移动,状态 3:高亮模式,仅提供有限的在文本上从左到右移动,并在文本移动时突出显示文本。

    要完成这个任务,它只需要一些基本的curses 函数调用。

    我制作了单独的窗口,但我只是假设一个单独的窗口来解释。

    在窗口中显示文本,坚持:

    window.addstr()
    window.refresh()
    

    用于移动光标:

    #get current cursor position
    curr_y, curr_x = window.getyx()
    
    # depending on direction, update the cursor with
    next_y, next_x = get_next_direction()
    
    # place cursor in new position
    window.move(next_y, next_x)
    
    window.refresh()
    

    一旦光标在高亮的起点上,按'v'进入高亮状态,并限制光标的移动,改变选中文本的属性:

    # get current cursor position
    curr_y, curr_x = window.getyx()
    
    # save position for later use
    start_y = curr_y; start_x = curr_x
    
    # loop until 'v' is pressed again
    while highlight_state:
        # change the attribute of the current character, for 1 character only, to reverse
        window.chgat(curr_y,curr_x, 1, curses.A_REVERSE)
        curr_y, curr_x = get_next_direction()
    
    # save end state, this is buggy obviously, but you get the point
    end_y = curr_y; end_x = curr_X
    

    现在从头到尾提取信息

    # get integer representation of char at positiong
    
    outstr = ''
    #from start to end
    char_as_int = windows.inch(y,x)
    char = char_as_int & 0000FF
    attr = char_as_int & FFFF00 #not useful here, but maybe later
    
    outstr += char
    

    就是这样!我还尝试了另一种方法来保存突出显示的材料,该材料基本上是将 x,y 坐标转换为正在显示的字符串的索引,但是让以字符串表示形式(换行符、制表符等)发出,另外是只是更难做到。

    如果有人有更有效/更清洁的方法,请回复!

    【讨论】:

      【解决方案2】:

      我对 ncurses 一无所知,但使用 Tkinter 或其他 GUI 工具包之一,可以使用画布完成。您将首先设置滚动区域,然后 绑定“h”键,以便将高亮变量设置为 True, 将鼠标单击绑定到检索开始位置的函数, 绑定左右箭头以向左或向右移动一个字母,并移动光标并反转下一个字母的颜色以及跟踪您从起点开始的字母数,这也告诉您结束位置,和 绑定“y”复制文本。

      它并不像看起来那么复杂,因为每个部分都是一个相当简单的功能。当然,所有这些都取决于字体大小,我建议使用固定字体显示文本,以便每个字母占据相同的宽度。再一次,我不知道 ncurses,但它与任何工具包都相似。如果您可以解决它,以便用户可以通过鼠标单击选择一整行,它会使编码更容易。如果您确实决定使用 Tkinter 或 wxPython 并需要一些额外的帮助,请发回一些代码。

      【讨论】:

      • 感谢您的回复。我想 Tkinter 可能更容易使用。问题是我必须远程运行到我必须 ssh 两次才能进入的服务器,并且最终服务器没有连接到互联网(它包含敏感信息)。我认为它有一个 Tkinter 库,所以我必须检查一下。因为我必须通过终端运行所有内容,所以我想我可以 ssh -X; ssh -X 能够创建一个窗口环境。
      猜你喜欢
      • 2011-03-26
      • 2012-07-27
      • 1970-01-01
      • 2021-07-23
      • 2011-09-14
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多