Python Проблемы с curses update_panels () и Panel.move () - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь научиться использовать Python Curses (и, надеюсь, построить простую игру), но почему-то я не могу заставить работать панели curses.

В частности, когда я пытаюсь выполнить update_panels (), мой скрипт (ниже) сразу же возвращается непосредственно к приглашению.

import curses, curses.panel, time as t

def main(stdscr):
    # Initialize some colors and styles
    curses.start_color()
    curses.init_pair( 1, curses.COLOR_RED, curses.COLOR_BLACK )
    pl_style = curses.color_pair( 1 ) + curses.A_BOLD + curses.A_REVERSE

    # Create a Background window and panel
    bg_W = curses.newwin( 10, 100, 5, 5 )
    bg_W.box(); 
    bg_W.addstr( 1, 2, "BG Window" )
    bg_P = curses.panel.new_panel( bg_W )
    bg_W.refresh(); t.sleep( 2 )

    # Create a Player window and panel
    pl_W = curses.newwin( 1, 1, 10, 20 )
    pl_W.insch( '+', pl_style )
    pl_P = curses.panel.new_panel( pl_W )
    pl_W.refresh(); t.sleep( 2 )

    # Update panels
    curses.panel.update_panels()
    curses.doupdate()

    # # Move the Player panel and update panels
    # pl_P.move( 10, 30 )
    # curses.panel.update_panels()
    # curses.doupdate()
    # t.sleep( 2 )

    while True: 
        if pl_W.getch() == 27: break

if __name__ == "__main__": 
    curses.wrapper( main )

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

import curses, curses.panel, time as t

def main(stdscr):
    # Initialize some colors and styles
    curses.start_color()
    curses.init_pair( 1, curses.COLOR_RED, curses.COLOR_BLACK )
    pl_style = curses.color_pair( 1 ) + curses.A_BOLD + curses.A_REVERSE

    # Create a Background window and panel
    bg_W = curses.newwin( 10, 100, 5, 5 )
    bg_W.box(); 
    bg_W.addstr( 1, 2, "BG Window" )
    bg_P = curses.panel.new_panel( bg_W )
    bg_W.refresh(); t.sleep( 2 )

    # Create a Player window and panel
    pl_W = curses.newwin( 1, 1, 10, 20 )
    pl_W.insch( '+', pl_style )
    pl_P = curses.panel.new_panel( pl_W )
    pl_W.refresh(); t.sleep( 2 )

    # # Update panels
    # curses.panel.update_panels()
    # curses.doupdate()

    # Move the Player panel and update panels
    pl_P.move( 10, 30 )
    curses.panel.update_panels()
    curses.doupdate()
    t.sleep( 2 )

    while True: 
        if pl_W.getch() == 27: break

if __name__ == "__main__": 
    curses.wrapper( main )

Ошибка, которую я получаю, выглядит следующим образом:

Traceback (most recent call last):
  File "panl2.py", line 36, in <module>
    curses.wrapper( main )
  File "C:\Program Files\Python38\lib\curses\__init__.py", line 105, in wrapper
    return func(stdscr, *args, **kwds)
  File "panl2.py", line 27, in main
    pl_P.move( 10, 30 )
_curses_panel.error: move_panel() returned ERR

Я чертовски долго пытался выяснить, что не так , но я получаю абсолютно никуда, и был бы очень благодарен за любое руководство.

Я использую windows -курсы (v2.1.0) с Python 3.8 (v3.8.1: 1b293b6) в стандартная командная строка Windows (v10.0.18362.449) на компьютере x64 Windows 10 Pro (v10.0.18362).

1 Ответ

0 голосов
/ 15 февраля 2020

ncurses 'move_panel функция возвращает результат из mvwin, который задокументирован следующим образом:

Вызов mvwin перемещает окно, так что верхний левый угол находится в положении (х, у). Если перемещение приведет к тому, что окно будет за пределами экрана, это ошибка, и окно не будет перемещено. Перемещение подокна разрешено, но его следует избегать.

В python вам придется использовать блок try / исключением, чтобы избежать просто выхода при возврате ошибки из ncurses.

Используя "windows -curses", базовой библиотекой, вероятно, является PDCurses (у которой нет документации, кроме комментариев в исходном коде). Однако его поддержка панели в конечном итоге пришла из той же ( Уоррен Такер ) реализации. Вы можете увидеть сообщения об ошибках в исходном коде .

Для чего стоит оригинальная библиотека панелей (автор неизвестен), с которой можно столкнуться на компьютере поставщика Unix (например, Solaris) сделал то же самое (см. source на Illumos-gate), но предоставленная документация не могла быть полезной, когда Такер разработал клон (см. "документация" ) .

...