31

这真的是两个问题:

  • 如何调整诅咒窗口的大小,以及
  • 如何处理诅咒中的终端调整大小?

是否可以知道窗口何时改变大小?

我真的找不到任何好的文档,甚至没有在http://docs.python.org/library/curses.html上介绍

4

5 回答 5

33

终端调整大小事件将导致curses.KEY_RESIZE键码。因此,您可以在 curses 程序中将终端调整大小作为标准主循环的一部分来处理,等待输入getch.

于 2011-03-04T09:51:54.730 回答
12

我让我的 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(),它会处理其余的事情。

于 2014-02-16T18:34:35.137 回答
3

我使用这里的代码。

在我的 curses-script 中,我不使用 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()
于 2019-07-25T15:34:37.300 回答
1

这在使用curses.wrapper()时对我有用:

if stdscr.getch() == curses.KEY_RESIZE:
    curses.resizeterm(*stdscr.getmaxyx())
    stdscr.clear()
    stdscr.refresh()
于 2020-01-03T00:03:52.473 回答
-1

It isn't right. It's an ncurses-only extension. The question asked about curses. To do this in a standards-conforming way you need to trap SIGWINCH yourself and arrange for the screen to be redrawn.

于 2014-01-26T07:18:40.923 回答