python 的诅咒中的堆栈溢出。它是模块中的错误吗?
Stack overflow in python's curses. Is it bug in the module?
我只是使用 'curses' 的初学者,无法确定这是 python 的 'curses' 模块中的错误还是我的错误使用。
我有以下测试代码:
import curses
import curses.textpad
screen = curses.initscr()
curses.noecho()
cl = curses.newwin( 15, 80, 10, 1 )
txtbox = curses.textpad.Textbox(cl,insert_mode=True)
def main( scr ):
global txtbox
s = txtbox.edit()
print(s)
if __name__ == '__main__':
ret = curses.wrapper( main )
当我运行它时,它启动OK,但是当按下任意键时,它开始无限递归并导致堆栈溢出。在curses/textpad.py
代码中可以看出,处理按键事件的函数实际上调用了自己:
def _insert_printable_char(self, ch):
(y, x) = self.win.getyx()
if y < self.maxy or x < self.maxx:
if self.insert_mode:
oldch = self.win.inch()
try:
self.win.addch(ch)
except curses.error:
pass
if self.insert_mode:
(backy, backx) = self.win.getyx()
if curses.ascii.isprint(oldch):
self._insert_printable_char(oldch) # <--- Is it bug?
self.win.move(backy, backx)
这是 python 的 textpad.py
模块中的错误,还是我的代码中遗漏了一些 curses 的初始化步骤?
我可以重现该问题,它似乎是通过在插入模式下使文本框 "too wide" 下方的 window 触发的。避免多重初始化(包装器完成所有工作),考虑:
import curses
import curses.textpad
import curses.wrapper
def main(scr):
win = curses.newwin( 15, 60, 10, 1 )
txtbox = curses.textpad.Textbox(win, insert_mode=True)
s = txtbox.edit()
return s
if __name__ == '__main__':
ret = curses.wrapper( main )
print ret
但是,如果您将 newwin
的第二个参数改回 80,错误就会触发。 (_insert_printable_char
中实现插入模式的递归似乎很好——它应该终止,因为它最终会遇到边框或不可打印的字符,但显然当 window 太宽时它不会).
我会继续调试,添加日志记录以查看到底出了什么问题,但与此同时我想 post 这是因为您可以使用稍微窄一点的 window 来避免触发错误)。
我只是使用 'curses' 的初学者,无法确定这是 python 的 'curses' 模块中的错误还是我的错误使用。
我有以下测试代码:
import curses
import curses.textpad
screen = curses.initscr()
curses.noecho()
cl = curses.newwin( 15, 80, 10, 1 )
txtbox = curses.textpad.Textbox(cl,insert_mode=True)
def main( scr ):
global txtbox
s = txtbox.edit()
print(s)
if __name__ == '__main__':
ret = curses.wrapper( main )
当我运行它时,它启动OK,但是当按下任意键时,它开始无限递归并导致堆栈溢出。在curses/textpad.py
代码中可以看出,处理按键事件的函数实际上调用了自己:
def _insert_printable_char(self, ch):
(y, x) = self.win.getyx()
if y < self.maxy or x < self.maxx:
if self.insert_mode:
oldch = self.win.inch()
try:
self.win.addch(ch)
except curses.error:
pass
if self.insert_mode:
(backy, backx) = self.win.getyx()
if curses.ascii.isprint(oldch):
self._insert_printable_char(oldch) # <--- Is it bug?
self.win.move(backy, backx)
这是 python 的 textpad.py
模块中的错误,还是我的代码中遗漏了一些 curses 的初始化步骤?
我可以重现该问题,它似乎是通过在插入模式下使文本框 "too wide" 下方的 window 触发的。避免多重初始化(包装器完成所有工作),考虑:
import curses
import curses.textpad
import curses.wrapper
def main(scr):
win = curses.newwin( 15, 60, 10, 1 )
txtbox = curses.textpad.Textbox(win, insert_mode=True)
s = txtbox.edit()
return s
if __name__ == '__main__':
ret = curses.wrapper( main )
print ret
但是,如果您将 newwin
的第二个参数改回 80,错误就会触发。 (_insert_printable_char
中实现插入模式的递归似乎很好——它应该终止,因为它最终会遇到边框或不可打印的字符,但显然当 window 太宽时它不会).
我会继续调试,添加日志记录以查看到底出了什么问题,但与此同时我想 post 这是因为您可以使用稍微窄一点的 window 来避免触发错误)。