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.

Python curses no vuelve a dibujar el borde; el redimensionamiento de la ventana arruina el borde.

Tengo un proyecto de curses muy simple (empecé a aprender esta biblioteca para un juego de texto temático de CLI) y quiero tener un borde alrededor de mi ventana. Sin embargo, al ejecutar screen.border() NO vuelve a dibujar el borde de mi pantalla, lo que hace que cambiar el tamaño de la ventana arruine por completo el borde.

Antes de cambiar el tamaño:
Antes de cambiar el tamaño de la ventana
Después de cambiar el tamaño:
Después de cambiar el tamaño de la ventana
Código actual:
“`py
if <strong>nombre</strong> == "<strong>principal</strong>":

<pre><code>import curses

pantalla = curses.initscr()
curses.cbreak()
curses.curs_set(0)
curses.noecho()
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
corriendo = True
tecla = None

while corriendo:
max_y, max_x = pantalla.getmaxyx()
pantalla.border()
pantalla.addstr(1, 1, "Código de tecla:", curses.color_pair(1))
pantalla.addstr(2, 1, str(tecla))
pantalla.refresh()
pantalla.timeout(20)
vieja_tecla = tecla
tecla = pantalla.getch()

if tecla >= 0:

coincide con tecla:

caso 27:
corriendo = False

caso curses.KEY_RESIZE:
pasar

caso _:
pasar

else:
tecla = vieja_tecla

pantalla.erase()

curses.endwin()
</code></pre>

“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mantener el borde al redimensionar la ventana en un proyecto de curses, deberás volver a dibujar el borde manualmente después de cada evento de redimensionamiento. Una forma de lograr esto es agregar una declaración condicional en el bucle while que verifique si el tamaño de la ventana ha cambiado y, si es así, vuelva a dibujar el borde utilizando screen.border(). Por ejemplo:

    if __name__ == "___main__":
    
        import curses
    
        screen = curses.initscr()
        ...
        running = True
        old_max_y, old_max_x = 0, 0  # almacenar el tamaño de ventana anterior
    
        while running:
            max_y, max_x = screen.getmaxyx()
    
            # verificar si el tamaño de la ventana ha cambiado y redibujar el borde si es así
            if max_y != old_max_y or max_x != old_max_x:
                screen.clear()
                screen.refresh()
                screen.border()
                old_max_y, old_max_x = max_y, max_x
    
            # continuar con el resto del bucle como antes
            screen.addstr(1, 1, "Código de tecla:", curses.color_pair(1))
            screen.addstr(2, 1, str(key))
            screen.refresh()
            ...
    

    En este fragmento de código, creamos dos variables old_max_y y old_max_x para almacenar el tamaño de ventana anterior. Dentro del bucle while, verificamos si el tamaño de ventana actual es diferente al tamaño de ventana anterior utilizando max_y != old_max_y y max_x != old_max_x. Si es así, borramos la pantalla con screen.clear(), actualizamos la pantalla con screen.refresh() y volvemos a dibujar el borde utilizando screen.border(). Finalmente, actualizamos las variables old_max_y y old_max_x para almacenar el tamaño de ventana actual.

Comments are closed.