python curses.newwin не работает - PullRequest
5 голосов
/ 03 июля 2010

Я впервые изучаю 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 ]

3 голосов
/ 03 июля 2010

Мне кажется нормально - я всегда использую curses.wrapper, и мой терминал не поддерживает видимость курсора 0, так что это то, что у меня есть ...:

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)

Я вижу перевернутое«Привет, мир!», Затем, когда я нажимаю любую клавишу, чтобы удовлетворить getch, программа завершает работу с ожидаемым сообщением got error (curs_set() returned ERR).

Что вы видите с этой программой ...?(Помните, что обертка делает initscr и устанавливает noecho и cbreak - и, что более важно, сбрасывает ее, когда это делается, поэтому я всегда использую ее; -).

Кстати, я используюPy 2.6.4 на Mac (OSx 10.5.8) и Terminal.App.Ваша платформа ...?

2 голосов
/ 03 июля 2010

Ах, нашел проблему. Когда я использую stdscr.clear (), он очищает весь терминал, включая новое окно. Все, что мне нужно было сделать, это сделать два окна, по одному для каждого отдельного дисплея.

О, и спасибо выше за curses.wrapper наконечник. Сказать здесь, потому что я не могу оставить комментарий.

...