これは本当に2つの質問です:
- 呪いのウィンドウのサイズを変更するにはどうすればよいですか。
- cursesで端末のサイズ変更を処理するにはどうすればよいですか?
ウィンドウのサイズがいつ変更されたかを知ることはできますか?
http://docs.python.org/library/curses.htmlでさえカバーされていない、私は本当に良いドキュメントを見つけることができません
これは本当に2つの質問です:
ウィンドウのサイズがいつ変更されたかを知ることはできますか?
http://docs.python.org/library/curses.htmlでさえカバーされていない、私は本当に良いドキュメントを見つけることができません
ターミナルのサイズ変更イベントにより、curses.KEY_RESIZE
キーコードが発生します。したがって、cursesプログラムの標準のメインループの一部として端末のサイズ変更を処理し、。を使用して入力を待つことができますgetch
。
いくつかのことを行うことで、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()
で残りは処理されます。
ここからのコードを使用します。
私の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()
これはcurses.wrapper()を使用するときに私のために働きました:
if stdscr.getch() == curses.KEY_RESIZE:
curses.resizeterm(*stdscr.getmaxyx())
stdscr.clear()
stdscr.refresh()
それは正しくありません。これはncurses-only
拡張機能です。について尋ねられた質問curses
。これを標準に準拠した方法でSIGWINCH
行うには、自分を閉じ込めて、画面が再描画されるように調整する必要があります。