Окно обработки писем Python (терминал) Изменение размера

Это два вопроса:

  • как изменить размер окна curses и
  • Как мне обращаться с терминальным изменением размера в проклятиях?

Можно ли узнать, когда окно изменило размер?

Я действительно не могу найти хороший документ, даже не покрытый http://docs.python.org/library/curses.html

Ответ 1

Событие изменения размера терминала приведет к curses.KEY_RESIZE key code. Поэтому вы можете обрабатывать размер терминала как часть стандартного основного цикла в программе curses, ожидая ввода с помощью getch.

Ответ 2

Я получил программу python, чтобы изменить размер терминала, выполнив несколько вещей.

# Initialize the screen
import curses

screen = curses.initscr()

# Check if screen was re-sized (True or False)
resize = curses.is_term_resized(y, x)

# Action in loop if resize is True:
if resize is True:
    y, x = screen.getmaxyx()
    screen.clear()
    curses.resizeterm(y, x)
    screen.refresh()

Когда я пишу свою программу, я вижу полезность размещения моего экрана в своем классе со всеми этими функциями, поэтому все, что мне нужно сделать, это вызвать Screen.resize(), и это позаботится обо всем остальном.

Ответ 3

Это неправильно. Это расширение ncurses-only. Вопрос о curses. Чтобы сделать это в соответствии со стандартами, вам нужно уловить SIGWINCH самостоятельно и организовать экранирование экрана.

Ответ 4

Я использую код из здесь.

В моем скрипте curses я не использую getch(), поэтому не могу реагировать на KEY_RESIZE.

Поэтому скрипт реагирует на SIGWINCH и в обработчике повторно вводит библиотеку curses. Это значит, конечно, вам придется все перерисовать, но я не смог найти лучшего решения.

Пример кода:

from curses import initscr, endwin
from signal import signal, SIGWINCH
from time import sleep

stdscr = initscr()

def redraw_stdscreen():
    rows, cols = stdscr.getmaxyx()
    stdscr.clear()
    stdscr.border()
    stdscr.hline(2, 1, '_', cols-2)
    stdscr.refresh()

def resize_handler(signum, frame):
    endwin()  # This could lead to crashes according to below comment
    stdscr.refresh()
    redraw_stdscreen()

signal(SIGWINCH, resize_handler)

initscr()

try:
    redraw_stdscreen()

    while 1:
        # print stuff with curses
        sleep(1)
except (KeyboardInterrupt, SystemExit):
    pass
except Exception as e:
    pass

endwin()