python curses.newwin 无法正常工作

7 投票
2 回答
8681 浏览
提问于 2025-04-16 00:46

我第一次学习使用curses库,决定用Python来做,因为这样比每次都重新编译要简单。不过,我遇到了一些问题。当我尝试更新第二个窗口时,没有任何输出。这里有一段代码:


import curses
win = curses.initscr()
curses.noecho()
curses.cbreak()
curses.curs_set(0)
field = curses.newwin(1, 20, 1, 1)
field.addstr(0, 0, "Hello, world!", curses.A_REVERSE)
field.refresh()

正常的窗口通过initscr()初始化是可以工作的,但那个字段窗口却没有显示出来。有没有人能帮帮我?

编辑:这是我修改后的新代码,但还是不行。

import curses

ex = None

def main(stdscr):
    global ex
    try:
        curses.curs_set(0)
    except Exception, e:
        ex = e

    field = curses.newwin(25, 25, 6, 6)
    field.border()
    cont = True
    x, y = 0, 0

    while cont:
        stdscr.clear()
        field.clear()
        coords = "%d, %d" % (x, y)
        stdscr.addstr(5, 5, coords, curses.A_REVERSE)
        field.addstr(y+2, x+2, "@", curses.A_BOLD)
        chr = stdscr.getkey()
        if chr == 'h':
            if x > 0: x -= 1
        if chr == 'l':
            if x < 20: x += 1
        if chr == 'j':
            if y > 0: y -= 1
        if chr == 'k':
            if y < 20: y += 1
        if chr == 'q':
            cont = False
            stdscr.clear()
            field.clear()
        stdscr.noutrefresh()
        field.noutrefresh()
        curses.doupdate()

curses.wrapper(main)

if ex is not None:
    print 'got %s (%s)' % (type(ex).__name__, ex)

2 个回答

4

对我来说这没问题——我总是使用 curses.wrapper,而我的终端不支持光标不可见,所以我就这样做了……:

import curses

ex = None

def main(stdscr):
    global ex
    try:
        curses.curs_set(0)
    except Exception, e:
        ex = e

    field = curses.newwin(1, 20, 1, 1)
    field.addstr(0, 0, "Hello, world!", curses.A_REVERSE) 
    field.refresh()
    field.getch()

curses.wrapper(main)
if ex is not None:
  print 'got %s (%s)' % (type(ex).__name__, ex)

我看到反向的“Hello, world!”,然后当我按下任何键来满足 getch 时,程序就会以预期的消息 got error (curs_set() returned ERR) 结束。

你在这个程序中看到了什么呢……?(记住,wrapper 会执行 initscr 并设置 noechocbreak,更重要的是在完成后会重置,这就是我总是使用它的原因;-)。

顺便说一下,我在 Mac 上使用的是 Py 2.6.4(OSx 10.5.8)和 Terminal.App。你的平台是什么……?

3

啊,找到了问题所在。当我使用 stdscr.clear() 时,它会清空整个终端,包括新创建的窗口。我只需要做两个窗口,每个窗口分别显示内容。

哦,还有,感谢上面提到的 curses.wrapper 的建议。在这里说一下,因为我不能发评论。

撰写回答