Shutil.get_terminal_size() не меняется

Я использую curses для печати довольно приятного пользовательского интерфейса консоли, и мне нужно, чтобы это что-то зависело от размера терминала. Для этого я прочитал здесь, что я мог используйте 1_. Итак, я делаю этот код:

def display(self):
    size_x,size_y = shutil.get_terminal_size()
    print(size_x,size_y)
    window_stat = curses.newwin(size_y,size_x//2-5,0,0)
    window_alert = curses.newwin(size_y,size_x//2-5,0,size_x//2+5)
    window_alert.addstr("\n   " + self.alert2string())
    window_stat.addstr("\n   " + self.stat2string())
    window_alert.box()
    window_stat.box()
    self.stdscr.refresh()
    window_stat.refresh()
    window_alert.refresh()

Но быстрота в том, что она отлично работает при первом вызове функции, но если я использую мышь, чтобы изменить размер терминала и вызвать функцию, результат shutil.get_terminal_size() всегда останется прежним. (120 30).

Вы хоть представляете, откуда это могло взяться? (На самом деле я использую Windows, и я бы хотел, чтобы она работала под всеми распространенными ОС)

Всем большое спасибо!


person Djazouli    schedule 07.10.2018    source источник


Ответы (1)


По сути, это потому, что приложение, использующее shutils (в данном случае) использует API консоли Windows для создания буфера фиксированного размера. В более традиционных Unix-подобных приложениях (вместо shutuils попыток создания высокоуровневых и переносимых) можно было бы создать SIGWINCH обработчик, уведомляющий приложение об изменении размера. В Windows вам нужно было бы получить это из цикла событий, который полностью скрыт интерфейсом shutils.

Так получилось, что он «работает» с Unix, потому что shutils не нужно обращать внимание на эти уведомления. Драйвер терминала операционной системы (обычно) может возвращать обновленную информацию.

Вы можете подать отчет об ошибке в отношении shutils, чтобы его разработчики учли это в своем дизайне.

person Thomas Dickey    schedule 07.10.2018