31

これは本当に2つの質問です:

  • 呪いのウィンドウのサイズを変更するにはどうすればよいですか。
  • cursesで端末のサイズ変更を処理するにはどうすればよいですか?

ウィンドウのサイズがいつ変更されたかを知ることはできますか?

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

それは正しくありません。これはncurses-only拡張機能です。について尋ねられた質問curses。これを標準に準拠した方法でSIGWINCH行うには、自分を閉じ込めて、画面が再描画されるように調整する必要があります。

于 2014-01-26T07:18:40.923 に答える