【问题标题】:Last character of a window in python + cursespython + curses中窗口的最后一个字符
【发布时间】:2023-10-12 15:13:01
【问题描述】:

以下程序引发错误:

import curses

def test(scr):
  top = curses.newwin(1, 10, 0, 0)
  top.addstr(0, 9, "X")

curses.wrapper(test)

看起来每当我尝试使用 addstr() 在窗口最后一行的最后一列中写入一个字符时(即使它小于屏幕),它都会引发错误。我不想滚动,我不在乎光标的位置。我想要的只是能够在窗口的每个位置写字符。有可能吗?我该怎么做?

【问题讨论】:

标签: python ncurses


【解决方案1】:

由于历史原因,使用诅咒似乎无法简单地写入窗口的最后一个字符。

我能找到的唯一解决方法是将字符写入其最终目的地左侧的一个位置,然后用插入推动它。以下代码会将“X”推到位置 9:

top = curses.newwin(1, 10, 0, 0)
top.addstr(0, 8, "X")
top.insstr(0, 8, " ")

【讨论】:

    【解决方案2】:

    事实证明,curses 实际上确实最终写入了最后一个位置:它只是随后引发了一个错误。

    所以,如果你能忍受以下 hack/inelegance:

    #! /usr/bin/env python
    import curses
    
    def test(scr):
        top = curses.newwin(1, 10, 0, 0)
        try:
            top.addstr(0, 9, "X")
        except curses.error:
            pass
    
    curses.wrapper(test)
    

    即捕获并忽略错误,那么代码在设计和实现上都会更加简单。

    【讨论】:

    • 我喜欢这种方法。它不是很干净,但我是这样处理的:我将窗口(其类不清楚)包装在 BaseWindow 类中,我在其中定义了所有方法。该类通过实现__getattr__ 来解析诸如addstr 之类的窗口方法名称,而__getattr__ 又将返回实际窗口的属性。我将该方法应用于addstr 方法:我的BaseWindow 现在定义了自己的addstr 方法,它尝试并调用实际窗口的addstr 方法,并静默传递任何curses.error 异常。
    最近更新 更多