【发布时间】:2019-06-28 10:43:46
【问题描述】:
我在带有标准 readline 和 curses 模块的 Debian Linux 9 机器上使用 Python 3.7。当在 xterm 中运行并且 xterm 被调整大小时,以下代码应输出“True”:
import readline
import os
import curses
terminal_resized = False
def main(stdscr):
global terminal_resized
ch = stdscr.getch()
if ch == curses.KEY_RESIZE:
terminal_resized = True
os.unsetenv('LINES')
os.unsetenv('COLUMNS')
curses.wrapper(main)
print(terminal_resized)
但是,输出为“False”,表明对 getch() 的调用未返回 KEY_RESIZE。实际上,它返回的是 -1。
请注意,如果我不导入 readline 模块,代码将按预期工作。
在谷歌搜索这个问题的解决方案时,我遇到了一个 2016 年的帖子,指出在导入 readline 和 curses 模块时存在冲突。基本上,readline 模块设置 'LINES' 和 'COLUMNS' 环境变量,这会干扰 ncurses 的内置 SIGWINCH 信号处理程序,这最终负责在调整终端大小时 getch() 返回 KEY_RESIZE。这就是为什么我在那里调用 unsetenv() 的原因。
但是,这些 unsetenv() 调用显然在 2019 年无效。确实,当我尝试在导入 readline 后打印出所有环境变量时,我在输出中看不到对“LINES”或“COLUMNS”的引用。不过,我还是把这些对 unsetenv() 的调用放在那里,看看它是否会做任何有用的事情。
有谁知道如何让 curses getch() 方法返回 KEY_RESIZE,就像在 Python 3.7 中导入 readline 模块时应该返回的那样?
【问题讨论】:
标签: python python-3.x readline curses