es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener líneas por separado utilizando un cuadro de texto de curses en Python?

Soy bastante nuevo en curses y me preguntaba si es posible obtener cada línea como una cadena diferente usando un cuadro de texto, o si hay alguna forma de separarlas. A continuación se muestra el código que estoy usando. Como puedes ver, solo hay dos líneas, pero no puedo encontrar una forma fácil sin manipular de alguna manera la cadena.

def boxinputstuff():
stdscr.addstr(0, 0, "Ctrl-G para enviar")

editwin = curses.newwin(2, 16, 2, 1)
rectangle(stdscr, 1, 0, 1 + 2 + 1, 1 + 16 + 1)
stdscr.refresh()

box = Textbox(editwin)

box.edit()

message = box.gather()
return message

Pensé que podría ser posible registrar la tecla “enter”, utilizada para comenzar la siguiente línea del cuadro, pero parece una solución demasiado complicada y poco ortodoxa.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible obtener cada línea como una cadena diferente utilizando un cuadro de texto en curses. Una forma de hacer esto es utilizando el método getyx() del objeto ventana para llevar un registro de la posición actual del cursor y, cuando el cursor llegue al final de una línea, agregar el contenido a una lista y restablecer la posición del cursor al inicio de la siguiente línea. Aquí tienes un ejemplo de modificación de tu código para lograr esto:

    def boxinputstuff():
        stdscr.addstr(0, 0, "Ctrl-G para enviar")
    
        editwin = curses.newwin(2, 16, 2, 1)
        rectangle(stdscr, 1, 0, 1 + 2 + 1, 1 + 16 + 1)
        stdscr.refresh()
    
        box = Textbox(editwin)
        lines = []
    
        while True:
            ch = box.edit()
    
            y, x = editwin.getyx()
    
            if ch == curses.ascii.NL:
                lines.append(box.gather()[:-1])
                editwin.move(y + 1, 0)
            elif ch == curses.ascii.BEL:
                # Ctrl-G para enviar
                break
    
        return lines
    

    Aquí, el método getyx() se utiliza para obtener la posición actual del cursor y, si se presiona la tecla NL (que representa la tecla Enter), el contenido de la línea actual se agrega a la lista lines y la posición del cursor se mueve al inicio de la siguiente línea. El bucle continúa hasta que se presiona la tecla BEL (que representa la tecla Ctrl-G) para indicar el final de la entrada, momento en el cual se devuelve la lista de líneas.

Comments are closed.