防止终端调整python curses的大小

时间:2015-06-01 10:55:40

标签: python linux terminal resize curses

我正在编写一个关于python curses的程序,我想知道是否有办法阻止终端调整大小以防止curses在Linux和Windows上崩溃。这就是发生的事情..我可以阻止这种情况吗?在Windows下这不会发生因为窗口大小调整不会影响提示比例... http://alessio.ragno.info/Before%20Resize.png http://alessio.ragno.info/After%20Resize.png

`

import curses
screenTest = curses.initscr()
boxTest = curses.newwin(24,80,0,0)
boxTest.box()
curses.noecho()
curses.cbreak()
curses.start_color()
screenTest.keypad(1)
curses.init_pair(1,curses.COLOR_BLACK, curses.COLOR_CYAN)
curses.init_pair(2,curses.COLOR_YELLOW, curses.A_NORMAL)
boxTest.border(0)
boxTest.addstr(1,1,78*"_")
boxTest.addstr(10,10,"Press ESC to quit...")
boxTest.refresh()
x = screenTest.getch()
while x != 27:
    boxTest.addstr(1,1,78*"_")
    boxTest.addstr(10,10,"Press ESC to quit...")
    boxTest.refresh()
    x = screenTest.getch()

curses.endwin()
exit()

`

1 个答案:

答案 0 :(得分:0)

终端将调整大小,因为用户这样做。没有一般的方法可以防止这种情况:抑制窗口装饰以消除调整大小的夹点是一种不可移植的部分解决方案。您可能会偶尔发现有关此方面的不同方面的评论,但没有全面的解决方案。以下是一些链接:

在curses / ncurses(不在PDCurses中)中,除非使用use_env函数禁用,否则库会关注环境变量LINESCOLUMNS。 ncurses在初始化期间为SIGWINCH添加了一个信号处理程序,用于检测(并响应)窗口大小调整(例如,参见resizeterm)。如果设置了这些环境变量,ncurses将不会响应。然而(见下文)改变这种特殊情况不会使Python停止崩溃,因为Python有比这更多的问题。

ncurses已经处理了大约20年的窗口大小调整;有应用程序无法使用它。如果没有一些特定的测试程序来讨论,就无法确定程序崩溃的原因。

关于6月2日早些时候增加的测试计划:

使用valgrind运行测试程序,我看到许多错误几乎都在 Python 本身(Debian 6和8上的2.6.6和2.7.9),以及一小部分Python释放ncurses拥有的内存。在每种情况下,Python都释放已经释放的内存。即使没有调整大小,它也会这样做(尽管一些不正确的释放与调整大小有关)。我跑了好几次,至少一次 none 检测到的错误是在ncurses中。根据valgrind的说法,Python中有几十个产生这些错误的点,其中一些占其检测到的400多个事件中的2/3。所以问题是错误的。 (我可以建议对测试程序本身进行一些改进,但似乎真正的问题是Python)。

相关问题