2011-07-24 14 views
8

Esta es mi primera publicación en el desbordamiento de la pila. He estado acechando este sitio por información durante años, y siempre es útil, así que pensé que publicaría mi primera pregunta.Resaltado y selección de texto con las maldiciones de Python

He estado buscando algunos ejemplos similares, pero parece que no encuentro nada.

En última instancia, estoy tratando de escribir una interfaz de usuario de texto simple para buscar falsos positivos y falsos negativos en un programa de extracción de texto. El módulo de falsos positivos es una selección simple de sí/no, y la visualización de texto en color y el uso de getch() es bastante fácil. Sin embargo, la parte negativa falsa es cada vez más difícil.

Así que esto es lo que quiero hacer:

  1. mostrar una cadena en la pantalla (se olvide de desplazamiento por ahora .... uf) Sólo será una cadena sin saltos de línea.
  2. El usuario ve el texto y presiona 'h' para ingresar al modo resaltado.
  3. , el usuario puede controlar el cursor para desplazarlo sobre una parte del texto (todavía visible), y seleccione 'v' para comenzar destacando (I tratando de hacer esto lo más cerca vi como pueda)
  4. El el usuario utiliza luego las teclas de control (flechas, hjkl) para mover el cursor desde un punto inicial al punto final, resaltando el texto en el camino. Esta parte resaltada debe ser una palabra que es un falso negativo
  5. El usuario presiona alguna tecla ('y' probablemente), y el texto seleccionado es de color, o permanece resaltado, y el texto resaltado se guarda en alguna variable que yo ' Lo manejaré más tarde.
  6. El usuario sale del modo de resaltado y continúa.

¿Alguna idea de empezar incluso? Estoy intentando cosas simples como mantener el texto en la pantalla y mover el cursor, pero fue en vano.

Conozco el módulo curses.textpad.TextBox(), pero realiza la edición como inserción y eliminación, lo que no quiero hacer. Tal vez hay una forma de desactivarlo.

Tengo otras preguntas, pero lo mantendré por ahora.

Gracias!

Neal

Editar: Para ser más específico, no estoy en busca de ayuda para escribir todo el programa, sólo ayuda a mover el cursor sobre el texto que se muestra, destacando, y seleccionándolo y guardarlo en una variable.

Respuesta

12

Me gustaría actualizar esta pregunta en caso de que alguien más esté buscando esta página en la web y tropieza con esta pregunta.

Bien, entonces la respuesta fue bastante simple y requirió leer todas las funciones enumeradas en la documentación de pitones malditos.

Lo que hice fue crear una máquina de 3 estados: Estado 1: modo Normal (solo muestra texto), Estado 2: modo de resaltar, permitir que el cursor se mueva alrededor de la ventana y Estado 3: modo resaltador, que proporciona solo movimiento limitado de izquierda a derecha sobre los textos y resalta el texto mientras se mueve.

Para realizar esta tarea, solo necesita algunas llamadas a funciones básicas de curses.

Hice ventanas separadas, pero solo asumiré una sola ventana para explicar.

Hacer texto de la pantalla en la ventana, seguir con el:

window.addstr() 
window.refresh() 

Para mover el cursor por:

#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() 

Una vez que el cursor se encuentra sobre el punto de partida para poner de relieve, 'v' de prensa ingrese el estado del resaltador y limite el movimiento del cursor, cambie el atributo del texto seleccionado:

Ahora extraiga esa información de principio a fin

# 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 

Eso es todo! También probé otra forma de guardar el material resaltado, que básicamente consistía en transformar las coordenadas x, y en el índice de la cadena que se estaba visualizando, pero que permitía emitir en la representación de cadenas (nuevas líneas, pestañas, etc.), además de simplemente más difícil de hacer

Si alguien tiene comentarios sobre un método más eficiente/más limpio, ¡responda!

0

No sé nada sobre ncurses, pero usando Tkinter o uno de los otros toolkits GUI, podría hacerse con un lienzo. Primero debe establecer la región de desplazamiento, luego enlazar la tecla "h" para que establezca una variable de resaltado en Verdadero, unir con un clic del mouse a una función que recupere la ubicación para iniciar, encuadernar las flechas izquierda y derecha para mover hacia la izquierda o bien, una sola letra, y mueva el cursor e invierta los colores de la siguiente letra, así como el seguimiento de la cantidad de letras del punto de partida, que también le indica la ubicación final, y añada "y" para copiar el texto.

No es tan complicado como podría parecer, ya que cada parte es una función bastante simple. Todo esto, por supuesto, dependerá del tamaño de la fuente, y sugeriría que se muestre el texto con una fuente fija para que cada letra ocupe el mismo ancho.Una vez más, no sé ncurses, pero sería similar a cualquier toolkit. Si puede solucionarlo para que el usuario pueda seleccionar una línea completa con un clic del mouse, la codificación será mucho más fácil. Publique con algún código si decide ir con Tkinter o wxPython y desea ayuda adicional.

+0

Gracias por la respuesta. Me imagino que Tkinter podría ser más fácil de usar. El problema es que tengo que ejecutar remotamente en el servidor al que tengo que enviar ssh dos veces para entrar, y el servidor final no está conectado a internet (contiene información confidencial). Creo que tiene una biblioteca de Tkinter, así que tendré que comprobarlo. Debido a que tengo que ejecutar todo a través de una terminal, creo que puedo ssh -X; ssh -X para poder crear un entorno de ventanas. – Neal

Cuestiones relacionadas