文档并没有真正提到如何删除窗口或面板;
curses的c api有
delwin
和del_panel
功能,但在python api中都没有;这是否意味着在 python 中删除窗口的正确方法是简单地取消对它的所有引用的链接并让它被垃圾收集?这同样适用于面板吗?
我发现
del_panel
的唯一地方是在 python curses.panel
模块中调用的地方是在释放器中:
static void
PyCursesPanel_Dealloc(PyCursesPanelObject *po)
{
PyObject *obj = (PyObject *) panel_userptr(po->pan);
if (obj) {
(void)set_panel_userptr(po->pan, NULL);
Py_DECREF(obj);
}
(void)del_panel(po->pan);
if (po->wo != NULL) {
Py_DECREF(po->wo);
remove_lop(po);
}
PyObject_DEL(po);
}
我无法发表评论,因为«我必须有 50 声望才能发表评论»,但我面临着同样的情况,到目前为止我找到的解决方案正如您在问题中所描述的:
只需取消对它的所有引用的链接并让它被垃圾收集
另请参阅类似问题中的以下建议,其中包含
touchwin()
/refresh()
序列。它也对我有用。说实话,不确定垃圾收集。
import curses
def main(stdscr):
stdscr.addstr(0, 0, 'Hello World!')
stdscr.refresh()
max_y, max_x = stdscr.getmaxyx()
win = curses.newwin(max_y, max_x)
win.addstr(0, 0, 'Hello from a second window.')
win.touchwin()
win.refresh()
win.getch()
stdscr.touchwin()
stdscr.refresh()
# second window being "cleared"
stdscr.getch()
curses.endwin()
curses.wrapper(main)
最后,我会坚持第一个解决方案,取消所有引用的链接。
需要注意的是,要考虑 Python 的垃圾收集,这在here中有详细描述。